1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| #include<stdio.h> #include<iostream> #include<cmath> #include<cstring> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #include<algorithm>
#define ls(i) t[(i)].l #define rs(i) t[(i)].r
using namespace std;
const int maxn=100010;
int cnt,n,m; int a[maxn],rt[maxn]; int b[maxn];
struct tree{ int l,r,sum; }t[maxn*20];
struct orztree{ inline void pushup(int i) { t[i].sum=t[ls(i)].sum+t[rs(i)].sum; } void build_tree(int i,int l,int r) { if(l==r) return ; t[i].l=++cnt; t[i].r=++cnt; int mid=(l+r)>>1; build_tree(ls(i),l,mid); build_tree(rs(i),mid+1,r); } void change_tree(int looker,int i,int l,int r,int x) { t[i].sum=t[looker].sum+1; t[i].l=t[looker].l; t[i].r=t[looker].r; if(l==r) return ; int mid=(l+r)>>1; if(x<=mid) t[i].l=++cnt,change_tree(ls(looker),ls(i),l,mid,x); else t[i].r=++cnt,change_tree(rs(looker),rs(i),mid+1,r,x); } int ask_kth_tree(int looker,int i,int l,int r,int k) { int tmp=t[ls(i)].sum-t[ls(looker)].sum; if(l==r) return b[l]; int mid=(l+r)>>1; if(k>tmp) return ask_kth_tree(rs(looker),rs(i),mid+1,r,k-tmp); else return ask_kth_tree(ls(looker),ls(i),l,mid,k); } }st;
int main() { ios::sync_with_stdio(false); register int i,j; cin>>n>>m; for(i=1;i<=n;i++) cin>>a[i],b[i]=a[i]; sort(b+1,b+n+1); int tot=unique(b+1,b+n+1)-b-1; for(i=1;i<=n;i++) a[i]=lower_bound(b+1,b+tot+1,a[i])-b; rt[0]=++cnt; st.build_tree(rt[0],1,n); for(i=1;i<=n;i++) rt[i]=++cnt,st.change_tree(rt[i-1],rt[i],1,n,a[i]); int t1,t2,t3; for(i=1;i<=m;i++) { cin>>t1>>t2>>t3; cout<<st.ask_kth_tree(rt[t1-1],rt[t2],1,n,t3)<<"\n"; } return 0; }
|