#include<bits/stdc++.h>
#define int long long
#define n 1000000000000000000
using namespace std;
int q,l,r,opt,cnt,root;
struct node{int ls,rs,bo,s,tag;}tree[5000010];
void push(int x,int len)
{
tree[tree[x].ls].s=(len+1)/2-tree[tree[x].ls].s;tree[tree[x].rs].s=len/2-tree[tree[x].rs].s;
tree[tree[x].ls].tag^=1,tree[tree[x].rs].tag^=1;
tree[x].tag=0;
}
void down(int x,int len)
{
tree[tree[x].ls].tag=tree[tree[x].rs].tag=0;
tree[tree[x].ls].s=tree[x].bo*(len+1)/2;tree[tree[x].rs].s=tree[x].bo*len/2;
tree[tree[x].ls].bo=tree[tree[x].rs].bo=tree[x].bo;
tree[x].bo=-1;
}
void change(int &x,int l,int r,int L,int R,int c)
{
if(!x) x=++cnt,tree[x].bo=-1;
if(l<=L&&R<=r) {tree[x].bo=c;tree[x].tag=0;tree[x].s=c*(R-L+1);return;}
int mid=(L+R)/2;
if(tree[x].bo!=-1)
{
if(!tree[x].ls) tree[x].ls=++cnt,tree[tree[x].ls].bo=-1;
if(!tree[x].rs) tree[x].rs=++cnt,tree[tree[x].rs].bo=-1;
down(x,R-L+1);
}
if(tree[x].tag)
{
if(!tree[x].ls) tree[x].ls=++cnt,tree[tree[x].ls].bo=-1;
if(!tree[x].rs) tree[x].rs=++cnt,tree[tree[x].rs].bo=-1;
push(x,R-L+1);
}
if(l<=mid) change(tree[x].ls,l,r,L,mid,c);
if(mid<r) change(tree[x].rs,l,r,mid+1,R,c);
tree[x].s=tree[tree[x].ls].s+tree[tree[x].rs].s;
}
void upd(int &x,int l,int r,int L,int R)
{
if(!x) x=++cnt,tree[x].bo=-1;
if(l<=L&&R<=r) {tree[x].tag^=1;tree[x].s=R-L+1-tree[x].s;return;}
int mid=(L+R)/2;
if(tree[x].bo!=-1)
{
if(!tree[x].ls) tree[x].ls=++cnt,tree[tree[x].ls].bo=-1;
if(!tree[x].rs) tree[x].rs=++cnt,tree[tree[x].rs].bo=-1;
down(x,R-L+1);
}
if(tree[x].tag)
{
if(!tree[x].ls) tree[x].ls=++cnt,tree[tree[x].ls].bo=-1;
if(!tree[x].rs) tree[x].rs=++cnt,tree[tree[x].rs].bo=-1;
push(x,R-L+1);
}
if(l<=mid) upd(tree[x].ls,l,r,L,mid);
if(mid<r) upd(tree[x].rs,l,r,mid+1,R);
tree[x].s=tree[tree[x].ls].s+tree[tree[x].rs].s;
}
int query(int &x,int L,int R)
{
if(!x) x=++cnt,tree[x].bo=-1;
if(tree[x].s==0) return L;
if(tree[x].s==R-L+1) return n+1;
int mid=(L+R)/2;
if(tree[x].bo!=-1)
{
if(!tree[x].ls) tree[x].ls=++cnt,tree[tree[x].ls].bo=-1;
if(!tree[x].rs) tree[x].rs=++cnt,tree[tree[x].rs].bo=-1;
down(x,R-L+1);
}
if(tree[x].tag)
{
if(!tree[x].ls) tree[x].ls=++cnt,tree[tree[x].ls].bo=-1;
if(!tree[x].rs) tree[x].rs=++cnt,tree[tree[x].rs].bo=-1;
push(x,R-L+1);
}
return min(n+1,min(query(tree[x].ls,L,mid),query(tree[x].rs,mid+1,R)));
}
signed main()
{
cin>>q;
while(q--)
{
scanf("%lld%lld%lld",&opt,&l,&r);
if(opt==1||opt==2) change(root,l,r,1,n,2-opt);
else upd(root,l,r,1,n);
printf("%lld\n",query(root,1,n));
}
}
RT