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
【思路】
主席树
戳这 click here
【代码】
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #define FOR(a,b,c) for(int a=(b);a<=(c);a++) 6 using namespace std; 7 8 typedef long long ll; 9 const int N = 1e5+10; 10 const int M = 2*1e6+10; 11 12 int n,m,tot,sz; 13 int v[N],hash[N],root[N]; 14 int sum[M],ls[M],rs[M]; 15 16 ll read() { 17 char c=getchar(); 18 ll x=0,f=1; 19 while(!isdigit(c)) { 20 if(c=='-') f=-1; c=getchar(); 21 } 22 while(isdigit(c)) 23 x=x*10+c-'0',c=getchar(); 24 return x*f; 25 } 26 void update(int l,int r,int x,int& y,int num) 27 { 28 y=++sz; 29 sum[y]=sum[x]+1; 30 if(l==r) return ; 31 ls[y]=ls[x],rs[y]=rs[x]; 32 int mid=(l+r)>>1; 33 if(num<=mid) update(l,mid,ls[x],ls[y],num); 34 else update(mid+1,r,rs[x],rs[y],num); 35 } 36 int query(int x,int y,int rk) 37 { 38 int a=root[x-1],b=root[y]; 39 int l=1,r=tot; 40 while(l<r) { 41 int mid=(l+r)>>1; 42 int now=sum[ls[b]]-sum[ls[a]]; 43 if(rk<=now) r=mid,a=ls[a],b=ls[b]; 44 else l=mid+1,rk-=now,a=rs[a],b=rs[b]; 45 } 46 return hash[l]; 47 } 48 int main() { 49 n=read(),m=read(); 50 FOR(i,1,n) 51 v[i]=read(),hash[i]=v[i]; 52 sort(hash+1,hash+n+1); 53 tot=unique(hash+1,hash+n+1)-hash-1; 54 FOR(i,1,n) 55 v[i]=lower_bound(hash+1,hash+tot+1,v[i])-hash; 56 FOR(i,1,n) { 57 update(1,tot,root[i-1],root[i],v[i]); 58 } 59 int x,y,z; 60 FOR(i,1,m) { 61 x=read(),y=read(),z=read(); 62 printf("%d",query(x,y,z)); 63 if(i!=m) puts(""); 64 } 65 return 0; 66 }