#17
测试点输入
3
1 1 1000000000000000000
3 1 999999999999999999
2 1000000000000000000 1000000000000000000
测试点输出
1000000000000000001
1
1
我的输出
1
1
#include<bits/stdc++.h>
#define int long long
#define double long double
#define INF INT_MAX
using namespace std;
int n;
int l,r;
struct node {
int l,r;
mutable int v;
node(int L,int R=0,int V=0) : l(L),r(R),v(V) {}
bool operator < (const node &x) const {
return l<x.l;
}
};
set<node> ODT;
set<node>::iterator spilit(int pos) {
set<node>::iterator it=ODT.lower_bound(node(pos,-1,0));
if(it!=ODT.end() && it->l==pos) return it;
it--;
if(it->r<pos) return ODT.end();
int V=it->v,L=it->l,R=it->r;
ODT.erase(it);
ODT.insert(node(L,pos-1,V));
return ODT.insert(node(pos,R,V)).first;
}
void bulldoze(int l,int r,int x) {
set<node>::iterator itr=spilit(r+1),itl=spilit(l);
ODT.erase(itl,itr);
ODT.insert(node(l,r,x));
}
void Reverse(int l,int r){
set<node>::iterator itr=spilit(r+1),itl=spilit(l);
for(;itl!=itr;itl++) itl->v=!itl->v;
}
void sum(){
for(set<node>::iterator it=ODT.begin();it!=ODT.end();it++){
if(!it->v){
cout<<it->l<<endl;
return;
}
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>n;
ODT.insert(node(1,1e18+5,0));
while(n--){
int op,l,r;
cin>>op>>l>>r;
if(op==1) bulldoze(l,r,1);
if(op==2) bulldoze(l,r,0);
if(op==3) Reverse(l,r);
sum();
}
return 0;
}