萌新初学OI,求助主席树
查看原帖
萌新初学OI,求助主席树
448884
快乐的大童楼主2022/3/11 22:18

RT

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
inline int R(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}return x*f;
}
inline void write(int x){
	if(x<0){x=-x;putchar('-');}
	int y=0;char z[40];
	while(x||!y){z[y++]=x%10+48;x/=10;}
	while(y--)putchar(z[y]);putchar(10);
}
const int N=2e5+5;
struct node{
	int leftson,rightson;
}d[N<<6];
int n,m;
int rt[N],a[N],s[N],cnt;
map<int,int>uid;
int build(int l,int r,int p){
	p=++cnt;
	if(l==r) return p;
	int mid=(l+r)>>1;
	d[p].leftson=build(l,mid,p);
	d[p].rightson=build(mid+1,r,p);
	return p;
}
int insert(int l,int r,int p,int k,int fa){
	p=++cnt;
	d[p].leftson=d[fa].leftson;
	d[p].rightson=d[fa].rightson;
	s[p]=s[fa]+1;
	if(l==r) return p;
	int mid=(l+r)>>1;
	if(k<=mid) d[p].leftson=insert(l,mid,p,k,d[p].leftson);
	else d[p].rightson=insert(mid+1,r,p,k,d[p].rightson);
	return p;
}
int query(int L,int R,int l,int r,int p,int k){
	if(l==r) return l;
	p=s[d[R].leftson]-s[d[L].leftson];
	int mid=(l+r)>>1;
	if(k<=p) return query(d[L].leftson,d[R].rightson,l,mid,p,k);
	else return query(d[L].rightson,d[R].rightson,mid+1,r,p,k-p);
}
int main(){
	n=R(),m=R();
	for(int i=1;i<=n;i++) a[i]=R();
	sort(a+1,a+n+1);
	n=unique(a+1,a+n+1)-(a+1);
	for(int i=1;i<=n;i++) uid[a[i]]=++cnt;
	cnt=0;
	rt[0]=build(1,n,rt[0]);
	for(int i=1;i<=n;i++){
		rt[i]=(1,n,rt[i],uid[a[i]],rt[i-1]);
	}
	for(int i=1,l,r,k;i<=m;i++){
		l=R(),r=R(),k=R();
		write(a[query(rt[l-1],rt[r],1,n,0,k)]);
	}
}

2022/3/11 22:18
加载中...