rt,蒟蒻调不出来,代码如下:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int K=1e7,L=1,R=1e18+10;
int n,l,r,f,ans;
namespace Sm_tree{
//1:0 2:1 3:xor
#define mid ((l+r)>>1)
int cnt=1,t[K],rs[K],ls[K];
short tag[K];
inline void up(int u){
if(!rs[u]) rs[u]=++cnt;
if(!ls[u]) ls[u]=++cnt;
t[u]=t[ls[u]]+t[rs[u]];
}
inline void down(int u,int l,int r){
if(!rs[u]) rs[u]=++cnt;
if(!ls[u]) ls[u]=++cnt;
if(!tag[u]) return ;
if(tag[u]^3){
t[ls[u]]=(mid-l+1)*(tag[u]-1);
t[rs[u]]=(r-mid)*(tag[u]-1);
tag[ls[u]]=tag[u];
tag[rs[u]]=tag[u];
}
else{
if(!tag[ls[u]]){
t[ls[u]]=mid-l+1-t[ls[u]];
tag[ls[u]]=3;
}
else{
if(tag[ls[u]]==1){
t[ls[u]]=mid-l+1;
tag[ls[u]]=2;
}
else{
t[ls[u]]=0;
tag[ls[u]]=1;
}
}
if(!tag[rs[u]]){
t[rs[u]]=r-mid-t[rs[u]];
tag[rs[u]]=3;
}
else{
if(tag[rs[u]]==1){
t[rs[u]]=r-mid;
tag[rs[u]]=2;
}
else{
t[rs[u]]=0;
tag[rs[u]]=1;
}
}
}
tag[u]=0;
}
inline void change(int u,int l,int r,int ll,int rr,int k){
if(ll<=l&&r<=rr){
if(k==3){
if(tag[u]==3){
t[u]=r-l+1-t[u];
tag[u]=0;
}
else{
if(!tag[u]){
t[u]=r-l+1-t[u];
tag[u]=3;
}
else{
if(tag[u]==1){
t[u]=r-l+1;
tag[u]=2;
}
else{
t[u]=0;
tag[u]=1;
}
}
}
}
else{
t[u]=(r-l+1)*(k-1);
tag[u]=k;
}
return ;
}
down(u,l,r);
if(ll<=mid) change(ls[u],l,mid,ll,rr,k);
if(rr>mid) change(rs[u],mid+1,r,ll,rr,k);
up(u);
}
inline int query(int u,int l,int r){
if(l==r){
if(t[u]==r-l+1){
return 0;
}
return l;
}
down(u,l,r);
if(t[ls[u]]<mid-l+1) return query(ls[u],l,mid);
else return query(rs[u],mid+1,r);
}
#undef mid
}
using namespace Sm_tree;
signed main(){
cin>>n;
for(int i=1; i<=n;i++){
scanf("%lld%lld%lld",&f,&l,&r);
if(f==1) f=2;
else if(f==2) f=1;
change(1,L,R,l,r,f);
ans=query(1,L,R);
if(!ans){
printf("1000000000000000001\n");
}
else{
printf("%lld\n",query(1,L,R));
}
}
return 0;
}