#include <bits/stdc++.h>
int top[100010];
struct node {
  int lazy, maxi;
  node() { lazy = maxi = 0; }
} t[400005];
void pushdown(int rt) {
  t[rt << 1].lazy += t[rt].lazy;
  t[rt << 1].maxi += t[rt].lazy;
  t[rt << 1 | 1].lazy += t[rt].lazy;
  t[rt << 1 | 1].maxi += t[rt].lazy;
  t[rt].lazy = 0;
}
void pushup(int rt) {
  t[rt].maxi = t[rt << 1].maxi > t[rt << 1 | 1].maxi ? t[rt << 1].maxi
                                                     : t[rt << 1 | 1].maxi;
}
void update(int l, int r, int rt, int L, int R, int val) {
  if (L <= l && R >= r) {
    t[rt].maxi += val;
    t[rt].lazy += val;
    return;
  }
  if (t[rt].lazy) pushdown(rt);
  int m = (l + r) / 2;
  if (m < R) {
    update(m + 1, r, rt << 1 | 1, L, R, val);
  }
  update(l, m, rt << 1, L, R, val);
  pushup(rt);
}
int query(int l, int r, int rt) {
  if (l == r) return l;
  if (t[rt].lazy) pushdown(rt);
  if (t[rt << 1 | 1].maxi > 0) return query((l + r) / 2 + 1, r, rt << 1 | 1);
  return query(l, (l + r) / 2, rt << 1);
}
int main() {
  int n;
  scanf("%d", &n);
  int id, op, val;
  for (int i = 0; i < n; i++) {
    scanf("%d %d", &id, &op);
    if (op == 0) {
      update(1, n, 1, 1, id, -1);
    } else {
      scanf("%d", &val);
      top[id] = val;
      update(1, n, 1, 1, id, 1);
    }
    if (t[1].maxi < 1) {
      printf("-1\n");
    } else {
      printf("%d\n", top[query(1, n, 1)]);
    }
  }
  return 0;
}
