求助求助求助求助求助求助求助求助求助求助主席树,萌新求助主席树!!!
代码代码在下面:
#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;
}