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

const int MAXR = 200000;

int dalsie_id;
vector<int> vplyv_rodiny;
vector<int> videne_rodiny;
vector<queue<int> > pacienti_v_cakarni;

bool lepsia_rodina(int r1, int r2) { 
    if (vplyv_rodiny[r1] != vplyv_rodiny[r2]) return vplyv_rodiny[r1] > vplyv_rodiny[r2];
    return r1 < r2;
}

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

int do_ordinacie() {
    sort( videne_rodiny.begin(), videne_rodiny.end(), lepsia_rodina );
    for (int r : videne_rodiny) {
        if (!pacienti_v_cakarni[r].empty()) {
            int vitaz = pacienti_v_cakarni[r].front();
            pacienti_v_cakarni[r].pop();
            return vitaz;
        }
    }
    return -1;
}

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";
    }
}
