标签:
7 3 1 5 2 6 3 7 4 2 5 3 4 4 1 1 7 3
5 6 3
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int maxn = 100010; 7 struct Node { 8 int L,R,sum; 9 } tree[maxn<<5]; 10 struct A{ 11 int x,id; 12 bool operator<(const A& rhs) const{ 13 return x < rhs.x; 14 } 15 }a[maxn]; 16 int root[maxn],rk[maxn],tot,n,m; 17 void update(int val,int &v,int L,int R) { 18 tree[tot] = tree[v]; 19 v = tot++; 20 ++tree[v].sum; 21 if(L == R) return; 22 int mid = (L + R)>>1; 23 if(val <= mid) update(val,tree[v].L,L,mid); 24 else update(val,tree[v].R,mid+1,R); 25 } 26 int query(int i,int j,int k,int L,int R) { 27 if(L == R) return L; 28 int tmp = tree[tree[j].L].sum - tree[tree[i].L].sum; 29 int mid = (L + R)>>1; 30 if(k <= tmp) return query(tree[i].L,tree[j].L,k,L,mid); 31 else return query(tree[i].R,tree[j].R,k - tmp,mid+1,R); 32 } 33 int main() { 34 while(~scanf("%d%d",&n,&m)){ 35 for(int i = 1; i <= n; ++i){ 36 scanf("%d",&a[i].x); 37 a[i].id = i; 38 } 39 sort(a+1,a+1+n); 40 for(int i = 1; i <= n; ++i) 41 rk[a[i].id] = i; 42 tot = 1; 43 memset(tree,0,sizeof tree); 44 root[0] = 0; 45 for(int i = 1; i <= n; ++i){ 46 root[i] = root[i-1]; 47 update(rk[i],root[i],1,n); 48 } 49 while(m--){ 50 int i,j,k; 51 scanf("%d%d%d",&i,&j,&k); 52 printf("%d\n",a[query(root[i-1],root[j],k,1,n)].x); 53 } 54 } 55 return 0; 56 }
标签:
原文地址:http://www.cnblogs.com/crackpotisback/p/4734998.html