/*Source Code Problem: 2104 User: 96655 Memory: 14808K Time: 1282MS Language: G++ Result: Accepted Source Code*/ #include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<vector> #include<stack> using namespace std; const int maxn=100005; struct node { int val[maxn],num[maxn]; }; struct Tree { int n,o[maxn]; node t[20]; void init(int len) { n=len; for(int i=1; i<=n; i++) { scanf("%d",&o[i]); t[0].val[i]=o[i]; } sort(o+1,o+n+1); build(1,n,0); } void build(int l,int r,int dep) { if(l==r)return; int m=(l+r)>>1; int lsame=m-l+1,same=0,ln=l,rn=m+1; for(int i=l; i<=r; i++) if(t[dep].val[i]<o[m])--lsame; for(int i=l; i<=r; i++) { if(i==l)t[dep].num[i]=0; else t[dep].num[i]+=t[dep].num[i-1]; if(t[dep].val[i]<o[m]) ++t[dep].num[i],t[dep+1].val[ln++]=t[dep].val[i]; else if(t[dep].val[i]>o[m]) t[dep+1].val[rn++]=t[dep].val[i]; else { ++same; { if(lsame>=same) ++t[dep].num[i],t[dep+1].val[ln++]=t[dep].val[i]; else t[dep+1].val[rn++]=t[dep].val[i]; } } } build(l,m,dep+1); build(m+1,r,dep+1); } int query(int st,int ed,int k,int l,int r,int dep) { if(l==r)return t[dep].val[l]; int lx,ly,rx,ry,m=(l+r)>>1; if(st==l)lx=0; else lx=t[dep].num[st-1]; ly=t[dep].num[ed]; if(ly-lx>=k) return query(l+lx,l+ly-1,k,l,m,dep+1); else { rx=st-l-lx; ry=ed-st+1-(ly-lx); return query(m+1+rx,m+rx+ry,k-(ly-lx),m+1,r,dep+1); } } }tree; int main() { int n,q; while(~scanf("%d%d",&n,&q)) { tree.init(n); while(q--) { int l,r,k; scanf("%d%d%d",&l,&r,&k); int ans=tree.query(l,r,k,1,n,0); printf("%d\n",ans); } } return 0; }
时间: 2024-10-18 17:10:22