code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn = 100000+231;
struct TREE{
int l,r,num,k;
}tree[maxn*30];
int f[maxn],cnt=0;
inline ll read_int(){
ll a=0,f=1,g=getchar();
while(g<'0'||g>'9'){if(g=='-') f=-1;g=getchar();}
while(g>='0'&&g<='9') a=a*10+g-'0',g=getchar();
return a*f;
}
inline void write(ll a,ll b){
if(a<0) a=-a,putchar('-');
ll lin[40],cnt=0;
while(a) lin[++cnt]=a%10,a/=10;
if(!cnt) cnt++,lin[cnt]=0;
while(cnt) putchar(lin[cnt]+'0'),cnt--;
if(b) putchar('\n');
}
void build(int & num,int l,int r){
if(!num) num=++cnt;
if(l==r) return;
int mid=(l+r)>>1;
build(tree[num].l,l,mid);
build(tree[num].r,mid+1,r);
}
void add(int num,int & newnum,int l,int r,int ads,int C){
if(!newnum) newnum=++cnt;
if(l==r) {tree[newnum].num=C,tree[newnum].k=1;return;}
int mid=(l+r)>>1;
if(ads<=mid) add(tree[num].l,tree[newnum].l,l,mid,ads,C),tree[newnum].r=tree[num].r;
else add(tree[num].r,tree[newnum].r,mid+1,r,ads,C),tree[newnum].l=tree[num].l;
tree[newnum].k=tree[tree[newnum].l].k+tree[tree[newnum].r].k;
return;
}
int ask(int num,int l,int r,int k){
if(l==r) return tree[num].num;
int mid=(l+r)>>1;
if(k<=mid) return ask(tree[num].l,l,mid,k);
else return ask(tree[num].r,mid+1,r,k);
}
int n,kkksc03=0;
inline void read(){
n=read_int();
build(kkksc03,1,n);
f[0]=1;
for(int i=1,jl=0;i<=n;i++){
int k=getchar(),C;
while(!(k=='T'||k=='Q'||k=='U')) k=getchar();
C=getchar();
while(!(('a'<=C&&C<='z')||('0'<=C&&C<='9'))) C=getchar();
if(k=='T'){
jl++;
add(f[jl-1],f[jl],1,n,tree[f[jl-1]].k+1,C);
}
else if(k=='Q'){
putchar(ask(f[jl],1,n,C-'0'));
putchar('\n');
}
else{
jl++;
f[jl]=f[jl-(C-'0')-1];
}
}
}
int main(){
read();
}
谢谢各位大佬
