#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
int n;
map<long long, int> m;
struct ST {
  struct node {
    int l, r, lz;
    bool MAX, MIN;
  } t[(MAXN * 3) << 2];
  void xxor(int x) {
    if (!t[x].MAX)
      t[x].MAX = t[x].MIN = 1;
    else if (t[x].MIN)
      t[x].MAX = t[x].MIN = 0;
  }
  void xorlz(int x) {
    if (t[x].lz >= 0 && t[x].lz <= 1)
      t[x].lz ^= 1;
    else if (t[x].lz == 2)
      t[x].lz = -1;
    else
      t[x].lz = 2;
  }
  void down(int x) {
    if (t[x].lz == -1) return;
    if (t[x].lz >= 0 && t[x].lz <= 1) {
      t[x << 1].MAX = t[x << 1].MIN = t[x << 1].lz = t[x].lz;
      t[x << 1 | 1].MAX = t[x << 1 | 1].MIN = t[x << 1 | 1].lz = t[x].lz;
    } else {
      xxor(x << 1);
      xxor(x << 1 | 1);
      xorlz(x << 1);
      xorlz(x << 1 | 1);
    }
    t[x].lz = -1;
  }
  void update(int x) {
    t[x].MIN = min(t[x << 1].MIN, t[x << 1 | 1].MIN);
    t[x].MAX = max(t[x << 1].MAX, t[x << 1 | 1].MAX);
  }
  void Build(int x, int l, int r) {
    t[x].l = l;
    t[x].r = r;
    t[x].MAX = t[x].MIN = t[x].lz = 0;
    if (l == r) return;
    int mid = (l + r) >> 1;
    Build(x << 1, l, mid);
    Build(x << 1 | 1, mid + 1, r);
  }
  void Cover(int x, int l, int r, int val) {
    if (l <= t[x].l && t[x].r <= r) {
      t[x].MIN = t[x].MAX = t[x].lz = val;
      return;
    }
    down(x);
    int mid = (t[x].l + t[x].r) >> 1;
    if (l <= mid) Cover(x << 1, l, r, val);
    if (mid + 1 <= r) Cover(x << 1 | 1, l, r, val);
    update(x);
  }
  void Xor(int x, int l, int r) {
    if (l <= t[x].l && t[x].r <= r) {
      xxor(x);
      xorlz(x);
      return;
    }
    down(x);
    int mid = (t[x].l + t[x].r) >> 1;
    if (l <= mid) Xor(x << 1, l, r);
    if (mid + 1 <= r) Xor(x << 1 | 1, l, r);
    update(x);
  }
  int query(int x) {
    if (t[x].l == t[x].r) return t[x].l;
    down(x);
    if (!t[x << 1].MIN)
      return query(x << 1);
    else
      return query(x << 1 | 1);
  }
} st;
struct caozuo {
  int opt;
  long long l, r;
} s[MAXN];
long long dz[MAXN * 3], LSH[MAXN * 3], tot, lsh;
void Add(long long x) { dz[++tot] = x; }
int main() {
  scanf("%d", &n);
  Add(1);
  for (int i = 1; i <= n; ++i) {
    scanf("%d %lld %lld", &s[i].opt, &s[i].l, &s[i].r);
    Add(s[i].l);
    Add(s[i].r);
    Add(s[i].r + 1);
  }
  sort(dz + 1, dz + tot + 1);
  for (int i = 1; i <= tot; ++i)
    if (dz[i] != dz[i - 1]) m[dz[i]] = ++lsh, LSH[lsh] = dz[i];
  st.Build(1, 1, lsh);
  for (int i = 1; i <= n; ++i) {
    if (s[i].opt <= 2)
      st.Cover(1, m[s[i].l], m[s[i].r], s[i].opt == 1 ? 1 : 0);
    else
      st.Xor(1, m[s[i].l], m[s[i].r]);
    printf("%lld\n", LSH[st.query(1)]);
  }
  return 0;
}
