#include <bits/stdc++.h>
using namespace std;
int cnt, n, stand[100005], len[100005];
struct node
{
int lc, rc;
char val;
} tree[2000005];
int build(int l, int r)
{
cnt++;
int p = cnt;
if (l == r) return p;
int mid = (l + r) / 2;
tree[p].lc = build(l, mid);
tree[p].rc = build(mid + 1, r);
return p;
}
int insert(int rt, int l, int r, int t, char x)
{
cnt++;
int p = cnt;
tree[p] = tree[rt];
if (l == r)
{
tree[p].val = x;
return p;
}
int mid = (l + r) / 2;
if (t <= mid) tree[p].lc = insert(tree[rt].lc, l, mid, t, x);
else tree[p].rc = insert(tree[rt].rc, mid + 1, r, t, x);
return p;
}
char query(int rt, int l, int r, int t)
{
if (l == r) return tree[rt].val;
int mid = (l + r) / 2;
if (t <= mid) return query(tree[rt].lc, l, mid, t);
return query(tree[rt].rc, mid + 1, r, t);
}
int main()
{
cin >> n;
int m = n;
stand[0] = build(1, n);
int jsq = 0;
while (m--)
{
char c;
cin >> c;
if (c == 'T')
{
char x;
cin >> x;
len[++jsq] = len[jsq - 1] + 1;
stand[jsq] = insert(stand[jsq - 1], 1, n, len[jsq], x);
}
else if (c == 'U')
{
int x;
cin >> x;
stand[++jsq] = stand[jsq - x - 1];
len[jsq] = len[jsq - x - 1];
}
else
{
int x;
cin >> x;
cout << query(stand[jsq], 1, n, x) << endl;
}
}
return 0;
}