最后两个点RE了,求大佬指导
#include <bits/stdc++.h>
using namespace std;
const int maxn=3e5+10;
int root[maxn],cnt;
struct node
{
int ls,rs;
int left,right;
int s;
}t[20*maxn+100];
long long b[maxn];
struct node2
{
long long x;
int rk,id;
}a[maxn];
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
inline bool cmp1(node2 x,node2 y)
{
return x.x<y.x;
}
bool cmp2(node2 x,node2 y)
{
return x.id<y.id;
}
void build(int i,int left,int right)
{
t[i].left=left;
t[i].right=right;
if(left==right)
return ;
int mid=(left+right)/2;
t[i].ls=++cnt;
build(cnt,left,mid);
t[i].rs=++cnt;
build(cnt,mid+1,right);
}
void insert(int pre,int now,int d)
{
t[now]=t[pre],t[now].s++;
if(t[now].left==t[now].right)
return ;
if(t[t[now].ls].right>=d)
{
t[now].ls=++cnt;
insert(t[pre].ls,t[now].ls,d);
}
else
{
t[now].rs=++cnt;
insert(t[pre].rs,t[now].rs,d);
}
}
inline long long query(int pre,int now,int k)
{
if(t[now].left==t[now].right)
return t[now].left;
if(t[t[now].ls].s-t[t[pre].ls].s>=k)
return query(t[pre].ls,t[now].ls,k);
else
return query(t[pre].rs,t[now].rs,k-(t[t[now].ls].s-t[t[pre].ls].s));
}
int n,m;
signed main()
{
cin>>n>>m;
root[0]=++cnt;
int mx=-1e9;
for(int i=1;i<=n;i++)
scanf("%d",&a[i].x),a[i].id=i;
sort(a+1,a+1+n,cmp1);
for(int i=1;i<=n;i++)
a[i].rk=i;
sort(a+1,a+1+n,cmp2);
build(1,1,n);
for(int i=1;i<=n;i++)
{
root[i]=++cnt;
insert(root[i-1],root[i],a[i].rk);
}
for(int i=1;i<=n;i++)
b[a[i].rk]=a[i].x;
int l,r,k;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",b[query(root[l-1],root[r],k)]);
}
return 0;
}