#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define LL __int128
#define mid (l+r >> 1)
#define ls(o) t[o].l
#define rs(o) t[o].r
const int N = 1e5 + 5;
int n, root[N], now, tot;
struct SegTree {
int l, r, sum;
} t[N * 28];
void pushup(int o) {
t[o].sum = t[ls(o)].sum + t[rs(o)].sum;
}
int build(int l, int r) {
int o = ++tot;
if(l == r) return o;
ls(o) = build(l, mid);
rs(o) = build(mid+1, r);
pushup(o); return o;
}
int add(int pre, int l, int r, int pos, int p) {
int o = ++tot;
t[o].l = t[pre].l;
t[o].r = t[pre].r;
t[o].sum = t[pre].sum;
if(l == r) { t[o].sum = p; return o; }
if(pos <= mid) t[o].l = add(ls(pre), l, mid, pos, p);
else t[o].r = add(rs(pre), mid+1, r, pos, p);
pushup(o); return o;
}
int query(int o, int l, int r, int pos) {
if(l == r) return t[o].sum;
if(pos <= mid) return query(ls(o), l, mid, pos);
return query(rs(o), mid+1, r, pos);
}
int main() {
scanf("%d", &n);
root[0] = build(1, n);
for(int i = 1; i <= n; i++) {
int x; char opt, a;
cin >> opt;
if(opt == 'T') {
cin >> a; now++;
root[now] = add(root[now-1], 1, n, now, a);
} else if(opt == 'U') {
scanf("%d", &x);
now -= x;
} else {
scanf("%d", &x);
cout << (char)query(root[now], 1, n, x) << "\n";
}
}
return 0;
}