// uplna hruba sila, pre kazdu 2 prejde celu cakaren
#include <algorithm>
#include <iostream>
#include <queue>
#include <set>
#include <vector>
using namespace std;

const int MAXR = 200000;

struct pacient { int id, rodina; };

int dalsie_id;
vector<int> vplyv_rodiny;
vector<pacient> pacienti_v_cakarni;

bool lepsi_pacient(const pacient &A, const pacient &B) {
    if (vplyv_rodiny[A.rodina] != vplyv_rodiny[B.rodina]) return vplyv_rodiny[A.rodina] > vplyv_rodiny[B.rodina];
    if (A.rodina != B.rodina) return A.rodina < B.rodina;
    return A.id < B.id;
}

void do_cakarne() {
    int id = dalsie_id++;
    int vplyv, rodina;
    cin >> vplyv >> rodina;
    if (vplyv > vplyv_rodiny[rodina]) vplyv_rodiny[rodina] = vplyv;
    pacienti_v_cakarni.push_back( {id, rodina} );
};

int do_ordinacie() {
    if (pacienti_v_cakarni.empty()) return -1;
    int najlepsi = 0;
    for (int i=1; i<int(pacienti_v_cakarni.size()); ++i) {
        if (lepsi_pacient(pacienti_v_cakarni[i], pacienti_v_cakarni[najlepsi])) najlepsi = i;
    }
    int vitaz = pacienti_v_cakarni[najlepsi].id;
    pacienti_v_cakarni.erase( pacienti_v_cakarni.begin()+najlepsi );
    return vitaz;
}

int main() {
    dalsie_id = 0;
    vplyv_rodiny.resize(MAXR, -1);
    while (true) {
        int typ;
        cin >> typ;
        if (typ == 0) break;
        if (typ == 1) do_cakarne();
        if (typ == 2) cout << do_ordinacie() << "\n";
    }
}
