主席树求调QWQ
查看原帖
主席树求调QWQ
497275
trp_hy楼主2023/2/28 17:06
#include<bits/stdc++.h>
#define N 1000005
using namespace std;

int t,now,tot,x;
int rt[N],sz[N];
char c1,c2;
struct tree{
	int ls,rs;
	char ch;
}tr[N*50];

inline int read(){
	int x=0,w=0; char c=0;
	while(!isdigit(c)){w|=c=='-';c=getchar();}
	while(isdigit(c)){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
	return w?-x:x;
} 

inline void insert(int &p,int v,int l,int r,int k,char x){
	p=++tot;
	tr[p]=tr[v];
	if(l==r){
		tr[p].ch=x;
		return;
	}
	int mid=l+r>>1;
	if(k<=mid) insert(tr[p].ls,tr[v].ls,l,mid,k,x);
	else insert(tr[p].rs,tr[v].rs,mid+1,r,k,x);
}

inline char ask(int p,int l,int r,int x){
	if(l==r) return tr[p].ch;
	int mid=l+r>>1;
	if(x<=mid) return ask(tr[p].ls,l,mid,x);
	else return ask(tr[p].rs,mid+1,r,x);
}

signed main(){
	t=read();
	for(int i=1;i<=t;++i){
		cin>>c1;
		if(c1=='T'){
			cin>>c2;
			sz[++now]=sz[now-1]+1;
			insert(rt[now],rt[now-1],1,t,sz[now],c2);
		}else if(c1=='U'){
			cin>>x;
			rt[++now]=rt[now-x-1];
			sz[now]=sz[now-x-1];
		}else if(c1=='Q'){
			cin>>x;
			cout<<(char)ask(rt[now],1,t,x)<<"\n";
		}
	}
	return 0;
}
2023/2/28 17:06
加载中...