#include <bits/stdc++.h>   using namespace std;   template <class T>   using vec = vector<T>;   template <typename Iter>   ostream &_IterOutput_(ostream &o, Iter b, Iter e, const string ss =   ,                         const string se =   ) {     o << ss;     for (auto it = b; it != e; it++) o << (it == b ?    :  ,  ) << *it;     return o << se;   }   template <typename T1, typename T2>   ostream &operator<<(ostream &o, const pair<T1, T2> &pair) {     return o <<  (  << pair.first <<  ,   << pair.second <<  ) ;   }   template <typename T>   ostream &operator<<(ostream &o, const vector<T> &vec) {     return _IterOutput_(o, begin(vec), end(vec),  [ ,  ] );   }   template <typename T>   ostream &operator<<(ostream &o, const set<T> &st) {     return _IterOutput_(o, begin(st), end(st),  { ,  } );   }   template <typename T, size_t N>   ostream &operator<<(ostream &o, const array<T, N> &arr) {     return _IterOutput_(o, begin(arr), end(arr),  | ,  | );   }   template <typename T1, typename T2>   ostream &operator<<(ostream &o, const map<T1, T2> &mp) {     o <<  { ;     for (auto it = mp.begin(); it != mp.end(); it++) {       o << (it == mp.begin() ?    :  ,  ) << it->first <<  :  << it->second;     }     o <<  } ;     return o;   }   void lucky_test() {     std::random_device rd;     std::mt19937 gen_(rd());     std::normal_distribution<double> dist_(0.0, 1.0);     if (dist_(gen_) >= 4.44444444) {       cout <<  Not lucky  << endl;       exit(0);     }   }   int N;   const int MX = 131072 * 4;   const int INF = 1e9;   int ZZ = 0;   struct Seg {     int val[MX];     int nl[MX], nr[MX];     int lz[MX];     void init(int id, int ql, int qr) {       nl[id] = ql;       nr[id] = qr;       val[id] = -INF;       if (ql == qr - 1) {         return;       }       int md = (ql + qr) / 2;       init(id * 2, ql, md);       init(id * 2 + 1, md, qr);     }     void push(int id) {       ZZ++;       int l = nl[id], r = nr[id];       int v = lz[id];       lz[id] = 0;       if (l == r - 1) {         return;       }       adj(id * 2, v);       adj(id * 2 + 1, v);       return;     }     void pull(int id) {       ZZ++;       int l = nl[id], r = nr[id];       if (l == r - 1) return;       val[id] = max(val[id * 2], val[id * 2 + 1]);     }     void adj(int id, int v) {       lz[id] += v;       val[id] += v;     }     void add(int id, int ql, int qr, int v) {       push(id);       int l = nl[id], r = nr[id];       if (l == ql and r == qr) {         adj(id, v);         return;       }       int md = (l + r) / 2;       if (qr <= md)         add(id * 2, ql, qr, v);       else if (ql >= md)         add(id * 2 + 1, ql, qr, v);       else {         add(id * 2, ql, md, v);         add(id * 2 + 1, md, qr, v);       }       pull(id);     }     int walk(int id) {       push(id);       if (val[id] < 0) return -1;       int l = nl[id], r = nr[id];       if (l == r - 1) {         return val[id] >= 0 ? l : -1;       }       if (val[id * 2 + 1] >= 0)         return walk(id * 2 + 1);       else         return walk(id * 2);     }   } tree;   struct Hao {     int val[MX];     int n;     void init(int id, int l, int r) {       n = r;       for (int i = l; i < r; i++) val[i] = -INF;     }     void add(int id, int l, int r, int v) {       for (int i = l; i < r; i++) val[i] += v;     }     int walk(int id) {       for (int i = n - 1; i >= 0; i--)         if (val[i] >= 0) return i;       return -1;     }     void dmp() {       for (int i = 0; i < n; i++) cout << val[i] <<    ;       cout << endl;     }   };   int V[MX];   int32_t main() {     do {       ios_base::sync_with_stdio(0);       cin.tie(0);     } while (0);     cin >> N;     tree.init(1, 0, N + 5);     for (int i = 0; i < N; i++) {       int p, t;       cin >> p >> t;       if (t == 0) {         tree.add(1, 0, p, -1);       } else {         cin >> V[p];         tree.add(1, p, p + 1, INF);         tree.add(1, 0, p, 1);       }       int pos = tree.walk(1);       if (pos == -1)         cout << -1 <<   n ;       else         cout << V[pos] <<   n ;     }     return 0;   }