代码都差不多,为什么我的主席树这么慢emm
#include<bits/stdc++.h>
using namespace std;
#define mid ((l+r)>>1)
#define ns (sum[lc[edn]]-sum[lc[edp]])
const int maxn=200010;
int now,sum[maxn<<5],lc[maxn<<5],rc[maxn<<5],n,m,a[maxn],drt[maxn],b[maxn],n1,czk,czl,czr,tt;
inline int build(int l,int r)
{
int tp=++now;
if(l==r)
return tp;
lc[tp]=build(l,mid);
rc[tp]=build(mid+1,r);
return tp;
}
int x;
inline int upd(int pre,int l,int r)
{
int tp=++now;
lc[tp]=lc[pre];
rc[tp]=rc[pre];
sum[tp]=sum[pre]+1;
if(l==r)
return tp;
if(x<=mid)
lc[tp]=upd(lc[pre],l,mid);
else
rc[tp]=upd(rc[pre],mid+1,r);
return tp;
}
inline int query(int edp,int edn,int l,int r,int k)
{
if(l==r)
return l;
if(ns>=k)
return query(lc[edp],lc[edn],l,mid,k);
else
return query(rc[edp],rc[edn],mid+1,r,k-ns);
}
int main()
{
ios::sync_with_stdio("false");
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+n+1);
n1=unique(b+1,b+n+1)-b-1;
drt[0]=build(1,n1);
for(int i=1;i<=n;i++)
{
x=lower_bound(b+1,b+n1+1,a[i])-b;
drt[i]=upd(drt[i-1],1,n1);
}
for(int i=1;i<=m;i++)
{
cin>>czl>>czr>>czk;
tt=query(drt[czl-1],drt[czr],1,n1,czk);
cout<<b[tt]<<endl;
}
}
虽然能过但是时间比别人慢好多