RT,没用离散化,用的动态开点,只AC了#1,2,3,5,#10RE,其他WA,求大佬帮忙调一调/kel
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 200005
#define Log 30
int n,m;
struct hjt_lint_tree
{
int tot,cnt;
int ls[Log*MAXN],rs[Log*MAXN];
int l[Log*MAXN],r[Log*MAXN];
int w[Log*MAXN];
int rt[MAXN];
int build(int ll,int rr)
{
tot++;
ls[tot]=rs[tot]=0;
l[tot]=ll;r[tot]=rr;
w[tot]=0;
return tot;
}
int change(int pre,int x,int ll,int rr)
{
int now=build(ll,rr);
w[now]=w[pre];
if(l[now]==r[now])
{
w[now]++;
return now;
}
int mid=(l[now]+r[now])/2;
if(x<=mid)
{
rs[now]=rs[pre];
ls[now]=change(ls[pre],x,l[now],mid);
}
else
{
ls[now]=ls[pre];
rs[now]=change(rs[pre],x,mid+1,r[now]);
}
w[now]=w[ls[now]]+w[rs[now]];
return now;
}
int ask(int lt,int rt,int k)
{
int p=(lt==0?rt:lt);
if(p==0) return 0;
if(l[p]==r[p]){return l[p];}
if(w[ls[rt]]-w[ls[lt]]>=k) return ask(ls[lt],ls[rt],k);
else return ask(rs[lt],rs[rt],k-(w[ls[rt]]-w[ls[lt]]));
}
}tr;
int main()
{
scanf("%d%d",&n,&m);
tr.rt[0]=tr.build(1,1000000000);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
tr.rt[i]=tr.change(tr.rt[i-1],x,1,1000000000);
}
for(int i=1;i<=m;i++)
{
int ll,rr,k;
scanf("%d%d%d",&ll,&rr,&k);
printf("%d\n",tr.ask(tr.rt[ll-1],tr.rt[rr],k));
}
return 0;
}