#include<cstdio>
#include<algorithm>
using namespace std;
inline int max(int a,int b){
return a < b ? b : a;
}
const int N = 200015;
struct node{
int l,r,sum;
char data;
}tree[N*20];
int n,tot = 0,cnt = 1,arr[N],brr[N],root[N],noww;
void pushup(int now){
tree[now].sum = tree[tree[now].l].sum+tree[tree[now].r].sum;
}
void update(int &now,int v,int l,int r,char w){
if(now == 0)now = ++tot;
tree[now] = tree[v];
if(l == r){
tree[now].sum = 1;
tree[now].data = w;
return;
}
int mid = l+r>>1;
if(tree[tree[now].l].sum < mid-l+1){
update(tree[now].l,tree[v].l,l,mid,w);
}
else{
update(tree[now].r,tree[v].r,mid+1,r,w);
}
pushup(now);
}
char query(int now,int l,int r,int k){
if(l == r){
return tree[now].data;
}
int mid = l+r>>1,sum = tree[tree[now].l].sum;
if(k <= sum)return query(tree[now].l,l,mid,k);
return query(tree[now].r,mid+1,r,k-sum);
}
char str[15],str2[5];
int main(){
scanf("%d",&n);
for(int i = 1;i <= n;i++){
scanf("%s",str);
if(str[0] == 'T'){
scanf("%s",str2);
cnt++;
update(root[cnt],root[cnt-1],1,n,str2[0]);
}
else if(str[0] == 'U'){
scanf("%d",&noww);
cnt++;
root[cnt] = root[cnt-noww-1];
}
else{
scanf("%d",&noww);
printf("%c\n",query(root[cnt],1,n,noww));
}
}
return 0;
}
提交过一遍