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

const int MAXR = 200000;

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;
vector<queue<int> > pacienti_v_cakarni;

void do_cakarne() {
    int id = dalsie_id++;
    int vplyv, rodina;
    cin >> vplyv >> 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]} );
    pacienti_v_cakarni[rodina].push(id);
};

int do_ordinacie() {
    if (rodiny_v_cakarni.empty()) return -1;
    int rodina = rodiny_v_cakarni.rbegin()->id;
    int vitaz = pacienti_v_cakarni[rodina].front();
    pacienti_v_cakarni[rodina].pop();
    if (pacienti_v_cakarni[rodina].empty()) {
        rodiny_v_cakarni.erase( {rodina, vplyv_rodiny[rodina]} );
    }
    return vitaz;
}

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