#include #include using namespace std; #define DIM 400004 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; }