求助求助求助求助求助求助求助求助求助求助
查看原帖
求助求助求助求助求助求助求助求助求助求助
658786
STUDENT00楼主2022/11/20 18:05

求助求助求助求助求助求助求助求助求助求助主席树,萌新求助主席树!!!

代码代码在下面:

#include<bits/stdc++.h>
#define ls tree[rt].l
#define rs tree[rt].r
#define N 100010
using namespace std;
int t,cnt=1,rt[N];
struct hjt{
	int l,r;
	char data;
	int size;
} tree[N<<5];
void update(int &rt,int fa,int l,int r,char c){
	rt=++cnt;
	ls=tree[fa].l;
	rs=tree[fa].r;
	tree[rt].data=tree[fa].data;
	tree[rt].size=tree[fa].size;
	if(l==r){
		tree[rt].data=c;
		tree[rt].size=1;
		return;
	}
	int mid=l+r>>1;
	if(tree[ls].size==mid-l+1) update(rs,tree[fa].r,mid+1,r,c);
	else update(ls,tree[fa].l,l,mid,c);
	tree[rt].size=tree[ls].size+tree[rs].size;
}
char query(int rt,int l,int r,int k){
	if(l==r) return tree[rt].data;
	int mid=l+r>>1;
	if(k<=tree[ls].size) return query(ls,l,mid,k);
	else return query(rs,mid+1,r,k-tree[ls].size);
}
int main(){
	scanf("%d",&t);
	for(int i=1;i<=t;i++){
		char c[1];
		scanf("%s",c);
		if(c[0]=='T'){
			char x[1];
			scanf("%s",x);
			update(rt[++cnt],rt[cnt-1],1,t,x[0]);
		}else if(c[0]=='U'){
			int x;
			scanf("%d",&x);
			rt[++cnt]=rt[cnt-x-1];
		}else{
			int x;
			scanf("%d",&x);
			putchar(query(rt[cnt],1,t,x));
			putchar(10);
		}
	}
	return 0;
}
2022/11/20 18:05
加载中...