因为太菜了,所以也不知道这题的算法到底应该叫做什么,看hzw博客中把这题归到主席树了,那我也归到主席树里吧。
其实我连主席树定义都不知道…
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,q,m,x,y,t,cnt;
int a[N],b[N],ll[N<<5],rr[N<<5],sum[N<<5],T[N];
int change(int pre,int l,int r,int x)
{
int rt=++cnt;
ll[rt]=ll[pre],rr[rt]=rr[pre],sum[rt]=sum[pre]+1;
if (l<r)
{
int mid=l+r>>1;
if (x<=mid) ll[rt]=change(ll[pre],l,mid,x);
else rr[rt]=change(rr[pre],mid+1,r,x);
}
return rt;
}
int query(int u,int v,int l,int r,int x)
{
if (l==r) return l;
int now=sum[ll[v]]-sum[ll[u]];
int mid=l+r>>1;
if (x<=now) return query(ll[u],ll[v],l,mid,x);
else return query(rr[u],rr[v],mid+1,r,x-now);
}
int main(){
scanf("%d%d",&n,&q);
for (register int i=1; i<=n; ++i) scanf("%d",&a[i]),b[i]=a[i];
sort(a+1,a+n+1);
m=unique(a+1,a+n+1)-a-1;
for (register int i=1; i<=n; ++i)
{
t=lower_bound(a+1,a+m+1,b[i])-a;
T[i]=change(T[i-1],1,m,t);
}
while (q--)
{
scanf("%d%d%d",&x,&y,&t);
t=query(T[x-1],T[y],1,m,t);
printf("%d\n",a[t]);
}
return 0;
}