#include <algorithm>
#include <iostream>
#include <queue>
#include <set>
#include <vector>
using namespace std;

const int MAXR = 200000;

struct udalost { int typ, id, vplyv, rodina, dalsi; };

struct rodina { int id, vplyv; };
bool operator< (const rodina &A, const rodina &B) {
    if (A.vplyv != B.vplyv) return A.vplyv < B.vplyv;
    return A.id > B.id;
}

int dalsie_id;
set<rodina> rodiny_v_cakarni;
vector<int> vplyv_rodiny, prvy_cakajuci;
vector<udalost> vstup;

void do_cakarne(int kde) {
    int id = vstup[kde].id, vplyv = vstup[kde].vplyv, rodina = vstup[kde].rodina;
    if (vplyv > vplyv_rodiny[rodina]) {
        rodiny_v_cakarni.erase( {rodina, vplyv_rodiny[rodina]} );
        vplyv_rodiny[rodina] = vplyv;
    }
    rodiny_v_cakarni.insert( {rodina, vplyv_rodiny[rodina]} );
};

int do_ordinacie(int kde) {
    if (rodiny_v_cakarni.empty()) return -1;
    int rodina = rodiny_v_cakarni.rbegin()->id;
    int vid = prvy_cakajuci[rodina];
    int vitaz = vstup[vid].id;
    prvy_cakajuci[rodina] = vstup[vid].dalsi;
    if (prvy_cakajuci[rodina] > kde) {
        rodiny_v_cakarni.erase( {rodina, vplyv_rodiny[rodina]} );
    }
    return vitaz;
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    dalsie_id = 0;
    vplyv_rodiny.resize(MAXR, -1);
    while (true) {
        int typ;
        cin >> typ;
        if (typ == 0) break;
        if (typ == 1) { int v, r; cin >> v >> r; vstup.push_back( {1,dalsie_id++,v,r,-1} ); }
        if (typ == 2) { vstup.push_back( {2,0,0,0,0} ); }
    }
    prvy_cakajuci.resize(MAXR, vstup.size());
    for (int i=vstup.size()-1; i>=0; --i) if (vstup[i].typ == 1) {
        vstup[i].dalsi = prvy_cakajuci[ vstup[i].rodina ];
        prvy_cakajuci[ vstup[i].rodina ] = i;
    }
    for (int i=0; i<int(vstup.size()); ++i) {
        if (vstup[i].typ == 1) do_cakarne(i); else cout << do_ordinacie(i) << "\n";
    }
}
