主席树全W求调,代码简单易懂
查看原帖
主席树全W求调,代码简单易懂
218752
smy2006楼主2022/4/5 17:18
#include<bits/stdc++.h>
using namespace std;

const int MAXN=1e5+15;
int n,root[MAXN],m,len[MAXN],cnt;

struct Segment_Tree{
	int l,r;char v;
}tre[MAXN<<4];

inline int clone(int p){
	tre[++cnt]=tre[p];return cnt;
}
int add(int l,int r,int p,int pos,char k){
	p=clone(p);
	if(l==r){
		tre[p].v=k;return p;
	}
	int mid=(l+r)>>1;
	if(pos<=mid) tre[p].l=add(l,mid,tre[p].l,pos,k);
	else tre[p].r=add(mid+1,r,tre[p].r,pos,k);
	return p;
}
char query(int l,int r,int p,int pos){
	if(l==r){return tre[p].v;}
	int mid=(l+r)>>1;
	if(pos<=mid) return query(l,mid,tre[p].l,pos);
	else return query(mid+1,r,tre[p].r,pos);
}

int main(){
	cin>>n;char opt,x;
	for(int i=1; i<=n; i++){
		cin>>opt>>x;
		if(opt=='T'){
			++m;root[m]=add(1,n,root[m-1],len[m-1]+1,x);len[m]=len[m-1]+1;
		}else if(opt=='U'){
			++m;root[m]=root[m-(x-'0')-1];len[m]=len[m-(x-'0')-1];
		}else{
			cout<<query(1,n,root[m],x-'0')<<endl;
		}
	}
} 
2022/4/5 17:18
加载中...