/*K-th Number
Time Limit: 20000MS Memory Limit: 65536KTotal Submissions: 44535 Accepted: 14779Case Time Limit: 2000MSDescriptionYou are working for Macrohard company in data structures department. After failing your previous task about key insertion you were asked to write a new data structure that would be able to return quickly k-th order statistics in the array segment.
That is, given an array a[1...n] of different integer numbers, your program must answer a series of questions Q(i, j, k) in the form: "What would be the k-th number in a[i...j] segment, if this segment was sorted?" For example, consider the array a = (1, 5, 2, 6, 3, 7, 4). Let the question be Q(2, 5, 3). The segment a[2...5] is (5, 2, 6, 3). If we sort this segment, we get (2, 3, 5, 6), the third number is 5, and therefore the answer to the question is 5.InputThe first line of the input file contains n --- the size of the array, and m --- the number of questions to answer (1 <= n <= 100 000, 1 <= m <= 5 000).
The second line contains n different integer numbers not exceeding 109 by their absolute values --- the array for which the answers should be given. The following m lines contain question descriptions, each description consists of three numbers: i, j, and k (1 <= i <= j <= n, 1 <= k <= j - i + 1) and represents the question Q(i, j, k).OutputFor each question output the answer to it --- the k-th number in sorted a[i...j] segment.
Sample Input7 3
1 5 2 6 3 7 42 5 34 4 11 7 3Sample Output5
63*/#include<cstdio>#include<iostream>#include<algorithm>using namespace std;int ls[8000008],rs[8000008],sum[8000008],root[100008],num[100009],n,m,hash[100009];int tmp,size,a[100008];void jia(int l,int r,int x,int &y,int v){ y=++size; sum[y]=sum[x]+1; if(l==r) return; ls[y]=ls[x]; rs[y]=rs[x]; int mid=(l+r)>>1; if(v<=mid) jia(l,mid,ls[x],ls[y],v); else jia(mid+1,r,rs[x],rs[y],v); return;}int xun(int L,int R,int V){ int x=root[L-1],y=root[R],l=1,r=tmp,mid=(l+r)/2; for(;l!=r;) if(sum[ls[y]]-sum[ls[x]]>=V) { x=ls[x]; y=ls[y]; r=mid; mid=(l+r)>>1; } else { V-=sum[ls[y]]-sum[ls[x]]; x=rs[x]; y=rs[y]; l=mid+1; mid=(l+r)>>1; } return l;}int main() { scanf("%d%d",&n,&m); for(int i=0;i<n; i++) { scanf("%d",&num[i]); a[i+1]=num[i]; } sort(num,num+n); hash[++tmp]=num[0]; for(int i=1;i<n;i++) if(hash[tmp]!=num[i]) hash[++tmp]=num[i]; for(int i=1;i<=n;i++) jia(1,tmp,root[i-1],root[i],lower_bound(hash+1,hash+n+1,a[i])-hash); for(int i=0;i<m;i++) { int l,r,v; scanf("%d%d%d",&l,&r,&v); printf("%d\n",hash[xun(l,r,v)]); } return 0;}