题目链接:Codeforces - MEX Queries
区间覆盖问题,显然可以使用ODT暴力。
于是试了一下并没有卡ODT。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
struct node{
int l,r; mutable int v;
bool operator < (const node &a) const{return l<a.l;}
};
set<node> s;
inline set<node>::iterator split(int pos){
auto it=s.lower_bound({pos,-1,0});
if(it!=s.end()&&it->l==pos) return it; it--;
int L=it->l,R=it->r,V=it->v;
s.erase(it); s.insert({L,pos-1,V});
return s.insert({pos,R,V}).first;
}
inline void assign(int l,int r,int v){
auto itr=split(r+1),itl=split(l);
s.erase(itl,itr); s.insert({l,r,v});
}
inline void rev(int l,int r){
auto itr=split(r+1),itl=split(l);
for(;itl!=itr;itl++) itl->v^=1;
}
inline int ask(){
for(auto x=s.begin();x!=s.end();x++){
if(x->v==0LL) return x->l;
}
return -1;
}
signed main(){
cin>>n;
s.insert({1LL,(int)1e18,0LL});
for(int i=1;i<=n;i++){
int op,l,r; scanf("%lld %lld %lld",&op,&l,&r);
if(op==1) assign(l,r,1);
else if(op==2) assign(l,r,0);
else rev(l,r);
printf("%lld\n",ask());
}
return 0;
}