为什么这题不打离散化连样例都过不了??
#include<cstdio>
using namespace std;
const int N=311000;
struct trnode{int lc,rc,c;}tr[N*30];int root[N],trlen;
int a[N];
int build(int l,int r){
trlen++;int now=trlen;
tr[now]=trnode{-1,-1,0};
if(l==r){
tr[now].c=a[l];
return trlen;
}
else{
int mid=(l+r)>>1;
tr[now].lc=build(l,mid);
tr[now].rc=build(mid+1,r);
return now;
}
}
int insert(int now,int l,int r,int x){
trlen++;int rt=trlen;
tr[rt]=tr[now],tr[rt].c++;
if(l==r)return rt;
else{
int mid=(l+r)>>1,lc=tr[now].lc,rc=tr[now].rc;
if(x<=mid)tr[rt].lc=insert(lc,l,mid,x);
else tr[rt].rc=insert(rc,mid+1,r,x);
return rt;
}
}
int query(int u,int v,int l,int r,int x){
if(l==r)return l;
else{
int mid=(l+r)>>1;
int sum=tr[tr[v].lc].c-tr[tr[u].lc].c;
if(x<=sum)return query(tr[u].lc,tr[v].lc,l,mid,x);
else return query(tr[u].rc,tr[v].rc,mid+1,r,x-sum);
}
}
int main(){
int n,m;scanf("%d%d",&n,&m);
trlen=0;root[0]=build(1,n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
root[i]=insert(root[i-1],1,n,a[i]);
}
for(int i=1;i<=m;i++){
int x,y,c;scanf("%d%d%d",&x,&y,&c);
int ans=query(root[x-1],root[y],1,n,c);
printf("%d\n",a[ans]);
}
return 0;
}