这份代码会 MLE:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10,mod=1e9+7;
int tot;
struct node
{
int l,r,sum,lc,rc;
}tr[N<<5];
int a[N],b[N],p,rt[N];
int find(int x)
{
return lower_bound(b+1,b+p+1,x)-b;
}
int build(int l,int r)
{
int u=++tot;
tr[u].l=l;
tr[u].r=r;
if(l==r) return u;
int mid=(l+r)>>1;
tr[u].lc=build(l,mid);
tr[u].rc=build(mid+1,r);
return u;
}
int modify(int u,int x)
{
int d=++tot;
tr[d]=tr[u],tr[d].sum++;
if(tr[d].l==tr[d].r) return d;
int mid=(tr[d].l+tr[d].r)>>1;
if(x<=mid) tr[d].lc=modify(tr[d].lc,x);
else tr[d].rc=modify(tr[d].rc,x);
return d;
}
int query(int u,int l,int r,int x)
{
if(tr[u].l==tr[u].r) return tr[u].l;
int mid=(tr[u].l+tr[u].r)>>1,p=tr[tr[r].lc].sum-tr[tr[l].lc].sum;
if(x<=p) return query(tr[u].lc,tr[l].lc,tr[r].lc,x);
else return query(tr[u].rc,tr[l].rc,tr[r].rc,x-p);
}
signed main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i],b[i]=a[i];
sort(b+1,b+n+1);
p=unique(b+1,b+n+1)-b-1;
rt[0]=build(1,n);
for(int i=1;i<=n;i++) rt[i]=modify(rt[i-1],find(a[i]));
while(m--)
{
int l,r,x;
cin>>l>>r>>x;
cout<<b[query(rt[0],rt[l-1],rt[r],x)]<<'\n';
}
return 0;
}
将常量 N 改为 2e5+10 即可 AC。
很明显,1e5*32 的空间对于主席树来说是不够的。但是想问,为什么是 MLE 而不是 RE 之类的?