40分的主席树求助
查看原帖
40分的主席树求助
455558
Imiya楼主2022/2/14 14:53

wa on #4,#6,#7,#8,#9,#10qwq

#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
const int N=200100,M=21;
inline int read(){
	int r=0,i=getchar(),s=1;
	while(i<'0'||i>'9')s=-1*(i=='-')<<1|1,i=getchar();
	while(i>='0'&&i<='9')r=(r<<1)+(r<<3)+(i^48),i=getchar();
	return r*s;
}
int L[N*M],R[N*M],ls[N*M],rs[N*M],sum[N*M],cnt;
int n,m,top[N],a[N],b[N];
map<int,int>mp;
inline int New(int a1,int a2,int a3,int a4,int a5){
	L[++cnt]=a1,R[cnt]=a2,ls[cnt]=a3,rs[cnt]=a4,sum[cnt]=a5;
	return cnt;
}
int build(int l,int r){
	if(l==r)return New(l,l,0,0,0);
	int mid=(l+r)>>1;
	return New(l,r,build(l,mid),build(mid+1,r),0);
}
int add(int id,int i,int k){
	if(L[id]==R[id])return New(L[id],R[id],0,0,sum[id]+k);int mid=(L[id]+R[id])>>1;
	if(i<=mid)return New(L[id],R[id],add(ls[id],i,k),rs[id],sum[id]+k);
	else return New(L[id],R[id],ls[id],add(rs[id],i,k),sum[id]+k);
}
inline int kth(int l,int r,int k){
	int x=top[r],y=top[l-1];
	while(L[x]<R[x]){
		if(sum[ls[x]]-sum[ls[y]]>=k)x=ls[x],y=ls[y];
		else k-=sum[ls[x]]-sum[ls[y]],x=rs[x],y=rs[y];
	}
	return L[x];
}
void init(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)a[i]=b[i]=read();
	sort(b+1,b+n+1);int u=0;
	for(int i=1;i<=n;i++)if(b[i]!=b[i-1])b[++u]=b[i],mp[b[i]]=u;
	top[0]=build(1,n);
	for(int i=1;i<=n;i++){
		a[i]=mp[a[i]];
		top[i]=add(top[i-1],a[i],1);
	}
}
int main(){
//	freopen("C://read.in","r",stdin);
	init();
	while(m--){
		int l=read(),r=read(),k=read();
		printf("%d\n",b[kth(l,r,k)]);
	}
	return 0;
}
2022/2/14 14:53
加载中...