本地能跑过,洛谷ide也可以,但是洛谷ide开o2就RE了,交洛谷评测机不开O2也RE,求大佬帮忙康康
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
struct HLTree
{
struct Tree { int l,r,lc,rc,val; } tree[N*30];
int cnt;
inline void build(int id,int l,int r)
{
tree[id].l=l; tree[id].r=r; tree[id].val=0;
if( l==r ) { tree[id].val=0; return; }
int mid=l+r>>1;
tree[id].lc=++cnt; tree[id].rc=++cnt;
build(tree[id].lc,l,mid); build(tree[id].rc,mid+1,r);
}
inline void Insert(int id,int id1,int l,int r,int k)
{
tree[id].l=l; tree[id].r=r;
if( l==r ) { tree[id].val=tree[id1].val+1; return; }
int mid=l+r>>1;
if( k <= mid ) tree[id].rc=tree[id1].rc,tree[id].lc=++cnt,Insert(cnt,tree[id1].lc,l,mid,k);
else tree[id].lc=tree[id1].lc,tree[id].rc=++cnt,Insert(cnt,tree[id1].rc,mid+1,r,k);
tree[id].val=tree[tree[id].lc].val+tree[tree[id].rc].val;
}
inline int query(int id,int id1,int k)
{
if( tree[id].l==tree[id].r ) return tree[id].l;
int tem=tree[tree[id1].lc].val-tree[tree[id].lc].val;
if( k <= tem ) return query(tree[id].lc,tree[id1].lc,k);
else query(tree[id].rc,tree[id1].rc,k-tem);
}
}t;
struct Node
{
int a,id;
}a[N];
int rk[N],num[N],rt[N];
inline int read()
{
int x=0,f=1; char ch=getchar();
while( ch < '0' or ch > '9' ) f *= ch=='-' ? -1 : 1, ch=getchar();
while( ch >= '0' and ch <= '9' ) x=x*10+ch-'0', ch=getchar();
return x*f;
}
inline bool cmp(Node x,Node y) { return x.a < y.a; }
int main()
{
int n=read(),m=read();
for(int i=1;i<=n;i++) a[i].a=read(), a[i].id=i;
sort(a+1,a+n+1,cmp);
int tot=0; t.cnt=0;
for(int i=1;i<=n;i++)
if( a[i].a==a[i-1].a ) rk[a[i].id]=tot;
else rk[a[i].id]=++tot,num[tot]=a[i].a;
rt[0]=++t.cnt;
t.build(rt[0],1,tot);
for(int i=1;i<=n;i++)
{
rt[i]=++t.cnt;
t.Insert(rt[i],rt[i-1],1,tot,rk[i]);
}
while( m-- )
{
int l=read(),r=read(),k=read();
printf("%d\n",num[t.query(rt[l-1],rt[r],k)]);
}
return 0;
}