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
Source
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #define N 100000 5 using namespace std; 6 int sum[8000010],ls[8000010],rs[8000010],root[N+10],hash[N+10],a[N+10],num[N+10]; 7 int n,m,cnt,size; 8 int findpos(int x) 9 { 10 int l=1,r=cnt,mid; 11 while (l<=r) 12 { 13 mid=(l+r)>>1; 14 if (hash[mid]<x) l=mid+1; 15 else r=mid-1; 16 } 17 return l; 18 } 19 20 void updata(int l,int r,int x,int &y,int v) 21 { 22 y=++size; sum[y]=sum[x]+1; 23 if (l==r) return; 24 ls[y]=ls[x]; rs[y]=rs[x]; 25 int mid=(l+r)>>1; 26 if (v<=mid) updata(l,mid,ls[x],ls[y],v); 27 else updata(mid+1,r,rs[x],rs[y],v); 28 } 29 30 int query(int l,int r,int x,int y,int k) 31 { 32 if (l==r) return l; 33 int mid=(l+r)>>1; 34 if (sum[ls[y]]-sum[ls[x]]>=k) return query(l,mid,ls[x],ls[y],k); 35 else return query(mid+1,r,rs[x],rs[y],k-(sum[ls[y]]-sum[ls[x]])); 36 } 37 38 int main() 39 { 40 scanf("%d%d",&n,&m); 41 for (int i=1;i<=n;i++) 42 { 43 scanf("%d",&a[i]); 44 num[i]=a[i]; 45 } 46 sort(num+1,num+n+1); 47 hash[++cnt]=num[1]; 48 for (int i=2;i<=n;i++) 49 if (num[i]!=num[i-1]) 50 hash[++cnt]=num[i]; 51 for (int i=1;i<=n;i++) 52 { 53 int t=findpos(a[i]); 54 updata(1,cnt,root[i-1],root[i],t); 55 } 56 for (int i=1;i<=m;i++) 57 { 58 int a,b,x,re; 59 scanf("%d%d%d",&a,&b,&x); 60 re=query(1,cnt,root[a-1],root[b],x); 61 printf("%d\n",hash[re]); 62 } 63 return 0; 64 }