数组不管开多大,#4 #6-10 都 MLE,感觉是哪里写挂了,但实在太弱调不出来,求大佬帮忙
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
int n,m,tot,cmpmode;
int rt[200010],ori[200010];//ori离散化用
struct num{
int val, ls, id;
bool operator <(const num& a) const{
if (cmpmode) return id<a.id;
else return val<a.val;
}
}a[200010];
struct node{
int ls, rs, val;
}stree[15887712];
int clone(int x){
stree[++tot]=stree[x];
return tot;
}
void pushup(int x){
stree[x].val=stree[stree[x].ls].val+stree[stree[x].rs].val;
return;
}
int build(int l, int r){
int x=++tot;
stree[x].val=0;
if (l==r) return x;
int mid=l+r>>1;
stree[x].ls=build(l,mid);
stree[x].rs=build(mid+1,r);
pushup(x);return x;
}
int update(int x, int l ,int r, int c, int dlt){
x=clone(x);
int mid=l+r>>1;
if (l==r&&l==c){
stree[x].val+=dlt;
return x;
}
if (c<=mid) stree[x].ls=update(stree[x].ls,l,mid,c,dlt);
if (c>mid) stree[x].rs=update(stree[x].rs,mid+1,r,c,dlt);
pushup(x);
return x;
}
int query(int lx, int rx, int l, int r, int k){
int t=stree[stree[rx].ls].val-stree[stree[lx].ls].val;
int mid=l+r>>1;
if (l==r){
return l;
}
if (t<k) return query(stree[lx].rs,stree[rx].rs,mid+1,r,k-t);
else return query(stree[lx].ls,stree[rx].ls,l,mid,k);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(nullptr);cout.tie(nullptr);
cin>>n>>m;
for (int i=1;i<=n;i++){
cin>>a[i].val;
a[i].id=i;
}
sort(a+1,a+1+n);
int lsid=0;
for (int i=1;i<=n;i++){
if (a[i].val!=a[i-1].val) lsid++;
a[i].ls=lsid;ori[lsid]=a[i].val;
}
cmpmode=1;sort(a+1,a+1+n);
rt[0]=build(1,lsid);
for (int i=1;i<=n;i++){
rt[i]=update(rt[i-1],1,lsid,a[i].ls,1);
}
for (int i=1;i<=m;i++){
int l,r,k;
cin>>l>>r>>k;
int x=query(rt[l-1],rt[r],1,lsid,k);
cout<<ori[x]<<endl;
}
return 0;
}