#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
struct Node {
  int maxv, add;
};
struct ran_tree {
  Node data[maxn * 4];
  int n;
  void init(int _n) {
    for (int i = 0; i <= _n * 4; ++i) {
      data[i].maxv = data[i].add = 0;
    }
    n = _n + 1;
  }
  void pushdown(int o) {
    int lc = o * 2 + 1, rc = o * 2 + 2;
    if (data[o].add) {
      data[lc].maxv += data[o].add;
      data[lc].add += data[o].add;
      data[rc].maxv += data[o].add;
      data[rc].add += data[o].add;
      data[o].add = 0;
    }
  }
  void update(int o, int l, int r, int x, int y, int d) {
    int lc = o * 2 + 1, rc = o * 2 + 2;
    if (x <= l && y >= r) {
      data[o].add += d;
      data[o].maxv += d;
      return;
    }
    int m = l + r >> 1;
    pushdown(o);
    if (x <= m) update(lc, l, m, x, y, d);
    if (y > m) update(rc, m + 1, r, x, y, d);
    pushup(o);
  }
  void pushup(int o) {
    int lc = o * 2 + 1, rc = o * 2 + 2;
    data[o].maxv = max(data[lc].maxv, data[rc].maxv);
  }
  int query(int o, int l, int r) {
    if (l == r) return l;
    pushdown(o);
    int m = l + r >> 1;
    int lc = o * 2 + 1, rc = o * 2 + 2;
    if (data[rc].maxv > 0) return query(rc, m + 1, r);
    return query(lc, l, m);
  }
};
ran_tree tree;
int a[maxn];
int main() {
  int n;
  scanf("%d", &n);
  tree.init(n);
  a[0] = -1;
  int t, op;
  for (int i = 0; i < n; ++i) {
    scanf("%d %d", &t, &op);
    if (op == 1) {
      scanf("%d", a + t);
      tree.update(0, 0, n, 0, t, 1);
    } else {
      tree.update(0, 0, n, 0, t, -1);
    }
    printf("%d\n", a[tree.query(0, 0, n)]);
  }
  return 0;
}
