Time Limit: 20000MS | Memory Limit: 65536K | |
Total Submissions: 39737 | Accepted: 12955 | |
Case Time Limit: 2000MS |
Description
Input
Output
Sample Input
7 3 1 5 2 6 3 7 4 2 5 3 4 4 1 1 7 3
Sample Output
5 6 3
Hint
//qscqesze #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define maxn 100001 #define eps 1e-9 const int inf=0x7fffffff; //无限大 int a[maxn],t[maxn]; int T[maxn*30],lson[maxn*30],rson[maxn*30],c[maxn*30]; int n,q,m; int tot; void init() { for(int i=1;i<=n;i++) t[i]=a[i]; sort(t+1,t+1+n); m=unique(t+1,t+1+n)-t-1; } int build(int l,int r) { int root=tot++; c[root]=0; if(l!=r) { int mid=(l+r)>>1; lson[root]=build(l,mid); lson[root]=build(mid+1,r); } return root; } int hash(int x) { return lower_bound(t+1,t+1+m,x)-t; } int update(int root,int pos,int val) { int newroot=tot++,tmp=newroot; c[newroot]=c[root]+val; int l=1,r=m; while(l<r) { int mid=(l+r)>>1; if(pos<=mid) { lson[newroot]=tot++; rson[newroot]=rson[root]; newroot=lson[newroot]; root=lson[root]; r=mid; } else { rson[newroot]=tot++; lson[newroot]=lson[root]; newroot=rson[newroot]; root=rson[root]; l=mid+1; } c[newroot]=c[root]+val; } return tmp; } int query(int left_root,int right_root,int k) { int l=1,r=m; while(l<r) { int mid=(l+r)>>1; if(c[lson[left_root]]-c[lson[right_root]]>=k) { r=mid; left_root=lson[left_root]; right_root=lson[right_root]; } else { l=mid+1; k-=c[lson[left_root]]-c[lson[right_root]]; left_root=rson[left_root]; right_root=rson[right_root]; } } return l; } int main() { while(cin>>n>>q) { tot=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } init(); T[n+1]=build(1,m); for(int i=n;i>=0;i--) { int pos=hash(a[i]); T[i]=update(T[i+1],pos,1); } while(q--) { int l,r,k; scanf("%d%d%d",&l,&r,&k); printf("%d\n",t[query(T[l],T[r+1],k)]); } } return 0; }
原文:http://www.cnblogs.com/qscqesze/p/4296138.html