GP of Nizhny Novgorod K. Rectangle Painting

GP of Nizhny Novgorod K. Rectangle Painting

PIC

/*
{
######################
#       Author       #
#        Gary        #
#        2021        #
######################
*/
#include<bits/stdc++.h>
#define rb(a,b,c) for(int a=b;a<=c;++a)
#define rl(a,b,c) for(int a=b;a>=c;--a)
#define LL long long
#define IT iterator
#define PB push_back
#define II(a,b) make_pair(a,b)
#define FIR first
#define SEC second
#define FREO freopen("check.out","w",stdout)
#define rep(a,b) for(int a=0;a<b;++a)
#define SRAND mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define random(a) rng()%a
#define ALL(a) a.begin(),a.end()
#define POB pop_back
#define ff fflush(stdout)
#define fastio ios::sync_with_stdio(false)
#define check_min(a,b) a=min(a,b)
#define check_max(a,b) a=max(a,b)
using namespace std;
//inline int read(){
//    int x=0;
//    char ch=getchar();
//    while(ch<'0'||ch>'9'){
//        ch=getchar();
//    }
//    while(ch>='0'&&ch<='9'){
//        x=(x<<1)+(x<<3)+(ch^48);
//        ch=getchar();
//    }
//    return x;
//}
const int INF=0x3f3f3f3f;
typedef pair<int,int> mp;
/*}
*/
const int N=1<<18;
set<int> tree[N+N];
int rest[N+N];
void pu(int now){
	rest[now]=(tree[now].empty()? N:*(tree[now].begin()));
	if(now<N) check_min(rest[now],max(rest[now<<1],rest[now<<1|1]));
}
int query(int a,int b,int now=1,int l=1,int r=N+1){
	if(r<=a||l>=b) return -INF;
	if(r<=b&&l>=a) return rest[now];
	int mid=(l+r)>>1;
	int ret=max(query(a,b,now<<1,l,mid),query(a,b,now<<1|1,mid,r));
	check_min(ret,(tree[now].empty()? N:*(tree[now].begin())));
	return ret;
}
void modify(int a,int b,int y,int ty,int now=1,int l=1,int r=N+1){
	if(a>=b) return ;
	if(r<=a||l>=b) return;
	if(r<=b&&l>=a){
		if(ty==1) tree[now].insert(y);
		else tree[now].erase(y);
		pu(now);
		return ;
	}
	int mid=(l+r)>>1;
	modify(a,b,y,ty,now<<1,l,mid);
	modify(a,b,y,ty,now<<1|1,mid,r);
	pu(now);
}
set<mp> seg[N+1];
void upd(int a,int b,int y){
	auto ite=seg[y].upper_bound(II(a,INF));
	if(ite!=seg[y].begin()) --ite;
	vector<mp> Seg;
	while(ite!=seg[y].end()){
		if(ite->FIR>b) break;
		auto nxt=next(ite);
		Seg.PB(*ite);
		modify(ite->FIR,ite->SEC+1,y,-1);
		seg[y].erase(ite);
		ite=nxt;
	}
	for(auto it:Seg){
		modify(it.FIR,min(it.SEC,a-1)+1,y,1);
		modify(max(it.FIR,b+1),it.SEC+1,y,1);
		if(it.FIR<=min(it.SEC,a-1)){
			seg[y].insert(II(it.FIR,min(it.SEC,a-1)));
		}
		if(it.SEC>=max(it.FIR,b+1)){
			seg[y].insert(II(max(it.FIR,b+1),it.SEC));
		}
	}
}

int main(){
	fill(rest,rest+N+N,N);
	int q;
	scanf("%d",&q);
	rb(i,0,N){
		seg[i].insert(II(1,N));
		modify(1,N+1,i,1);
	}
	LL sum=0;
	
	while(q--){
		int ty;
		scanf("%d",&ty);
		if(ty==1){
			LL y,l,r;
			scanf("%lld%lld%lld",&y,&l,&r);
			y^=sum,l^=sum,r^=sum;
			upd(l,r,y);
		}
		else{
			LL l,r;
			scanf("%lld%lld",&l,&r);
			l^=sum,r^=sum;
			int ans=query(l,r+1);
			sum+=ans;
			printf("%d\n",ans);		
		}
	}
	return 0;
}

posted @ 2021-02-24 15:48  WWW~~~  阅读(86)  评论(0编辑  收藏  举报