#include <iostream>
#include <cstdio>

using namespace std;

#define DIM 100004

int N, tip, x;
int V[DIM], arbint[DIM], scoatere[DIM], query[DIM];

void update(int nod, int st, int dr, int value, int pos) {
    if(st == dr) {
        arbint[nod] = value;
        return ;
    }

    int mij = (st + dr) / 2;
    if(pos <= mij) update(nod * 2, st, mij, value, pos);
    if(pos > mij) update(nod * 2 + 1, mij + 1, dr, value, pos);

    arbint[nod] = max(arbint[2 * nod], arbint[2 * nod + 1]);
}

int look(int nod, int st, int dr, int a, int b) {
    if(a <= st && dr <= b) {
        return arbint[nod];
    }

    int mij = (st + dr) / 2;
    int ans1 = 0, ans2 = 0;
    if(a <= mij) {
        ans1 = look(2 * nod, st, mij, a, b);
    }

    if(b > mij) {
        ans2 = look(2 * nod + 1, mij + 1, dr, a, b);
    }

    return max(ans1, ans2);
}

int main() {
    #ifndef ONLINE_JUDGE
    freopen("input.txt","r",stdin);
    #endif // ONLINE_JUDGE

    cin >> N;

    for(int i = 1; i <= N; ++i) {
        cin >> tip;

        if(tip == 1) {
            cin >> x;
            V[++V[0]] = x;
        }
        else if(tip == 2){
            scoatere[++scoatere[0]] = i;
        }
        else {
            query[++query[0]] = i;
        }
    }

    for(int i = 1; i <= V[0]; ++i) {
        update(1, 1, V[0], V[i], i);
    }

    query[0] = scoatere[0] = 1;
    int in = 1, sf = 0;
    for(int i = 1; i <= N; ++i) {
        if(query[query[0]] != i && scoatere[scoatere[0]] != i) {
            ++sf;
        }
        else {
            if(scoatere[scoatere[0]] == i) {
                ++in;
                ++scoatere[0];
            }
            else {
                cout << look(1, 1, V[0], in, sf) << '\n';
                ++query[0];
            }
        }
    }

    return 0;
}