#include <bits/stdc++.h>
const int MAXN = 1e5 + 10;
using namespace std;
struct node {
  int val, lazy, best;
  node() { val = lazy = 0; }
};
int m(int l, int r) { return (l + r) / 2; }
node v[4 * MAXN];
void refresh(int pos, int l, int r) {
  int V = v[pos].lazy;
  v[pos].val += V;
  v[pos].best += V;
  v[pos].lazy = 0;
  if (l == r) return;
  v[pos * 2].lazy += V;
  v[pos * 2 + 1].lazy += V;
}
void merge(int pos) {
  v[pos].best = max(v[pos * 2].best, v[pos * 2 + 1].best);
  v[pos].val = v[pos * 2].val + v[pos * 2 + 1].val;
}
void upd(int no, int l, int r, int ini, int fim, int k) {
  refresh(no, l, r);
  if (l > fim || r < ini) return;
  if (l >= ini && r <= fim) {
    v[no].lazy += k;
    refresh(no, l, r);
    return;
  }
  upd(2 * no, l, m(l, r), ini, fim, k);
  upd(2 * no + 1, m(l, r) + 1, r, ini, fim, k);
  merge(no);
}
int BB(int no, int l, int r) {
  if (l == r) return r;
  refresh(no, l, r);
  refresh(2 * no, l, m(l, r));
  refresh(2 * no + 1, m(l, r) + 1, r);
  if (v[2 * no + 1].best > 0)
    return BB(2 * no + 1, m(l, r) + 1, r);
  else if (v[2 * no].best > 0)
    return BB(2 * no, l, m(l, r));
  return -1;
}
int main() {
  int N, r[MAXN];
  scanf("%d", &N);
  for (int i = 0; i < N; i++) {
    int p, t;
    scanf("%d%d", &p, &t);
    if (t == 1) scanf("%d", &r[p]);
    if (t == 0)
      upd(1, 0, N, 0, p, -1);
    else
      upd(1, 0, N, 0, p, 1);
    int k = BB(1, 0, N);
    if (k == -1)
      printf("-1\n");
    else
      printf("%d\n", r[k]);
  }
}
