Kth number
HDU - 2665
主席树的空间复杂度约为2*nlog(n)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 100000
int a[N],b[N];
int L[N*32],R[N*32];
int sum[N*32],T[N];
int cnt=0;
inline int read()
{
char c;
int x=0;
c=getchar();
int f=1;
while(c<'0'||c>'9')
{
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
void build(int &rt,int l,int r)
{
rt=++cnt;
if(l==r)return ;
int m=(l+r)>>1;
build(L[rt],l,m);
build(R[rt],m+1,r);
}
void update(int &rt,int pre,int l,int r,int x)
{
rt=++cnt;
L[rt]=L[pre],R[rt]=R[pre];
sum[rt]=sum[pre]+1;
if(l==r)return ;
int m=(l+r)>>1;
if(x<=m) update(L[rt],L[pre],l,m,x);
else update(R[rt],R[pre],m+1,r,x);
}
int query(int i,int j,int l,int r,int k)
{
//cout<<"l r"<<l<<" "<<r<<endl;
if(l==r)return l;
int res=sum[L[j]]-sum[L[i]];
//cout<<"res="<<res<<endl;
int m=(l+r)>>1;
if(k<=res) return query(L[i],L[j],l,m,k);
else return query(R[i],R[j],m+1,r,k-res);
}
int main()
{
int t;
t=read();
while(t--)
{
int n,m;
cnt=0;
n=read();
m=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
b[i]=a[i];
}
sort(b+1,b+1+n);
int len=unique(b+1,b+n+1)-b-1;
//cout<<"len"<<len<<endl;
build(T[0],1,len);
for(int i=1;i<=n;i++)
{
int p=lower_bound(b+1,b+1+len,a[i])-b;
update(T[i],T[i-1],1,len,p);
}
int l,r,x;
for(int i=0;i<m;i++)
{
l=read(),r=read(),x=read();
printf("%d\n",b[query(T[l-1],T[r],1,len,x)]);
}
}
}
加了快读竟然满了200多毫秒。。。。。