个人感觉问题出在 update 上了
#include<bits/stdc++.h>
#define M 300001
#define inf 2e9
#define ls p<<1
#define rs p<<1|1
using namespace std;
inline int read()
{
int k=0,f=0;char c=getchar();
for(;!isdigit(c);c=getchar()) f|=c=='-';
for(;isdigit(c);c=getchar()) k=(k<<1)+(k<<3)+(c^48);
return f?-k:k;
}
int n,idx;
int node,root[M];
string s;
struct tree
{
int val,lson,rson;
}t[M<<5];
int build(int l,int r)
{
int rt=++node,mid=(l+r)>>1;
if(l==r) return rt;
t[rt].lson=build(l,mid),t[rt].rson=build(mid+1,r);
return rt;
}
int update(int pre,int l,int r,int idx,int x)
{
int rt=++node,mid=(l+r)>>1;
t[rt].lson=t[pre].lson,t[rt].rson=t[pre].rson;
if(l==r)
{
t[rt].val=x;
return rt;
}
if(idx<=mid) t[rt].lson=update(t[pre].lson,l,mid,idx,x);
else t[rt].rson=update(t[pre].rson,mid+1,r,idx,x);
return rt;
}
int query(int p,int l,int r,int x)
{
if(l==r) return t[p].val;
int mid=(l+r)>>1;
if(x<=mid) return query(t[p].lson,l,mid,x);
else return query(t[p].rson,mid+1,r,x);
}
char get(int k)
{
return k+'a';
}
int main()
{
n=read();
root[0]=build(1,n);
for(int i=1;i<=n;i++)
{
cin>>s;
if(s=="T")
{
idx++;
cin>>s;
int x=s[0]-'a';
root[idx]=update(root[idx-1],1,n,idx,x);
}
else if(s=="U")
{
int k=read();
idx-=k;
node=root[idx];
}
else
{
int x=read();
int ans=query(root[idx],1,n,x);
printf("%c\n",get(ans));
}
}
return 0;
}