제출 #1185460

#제출 시각아이디문제언어결과실행 시간메모리
1185460PieArmySegments (IZhO18_segments)C++20
100 / 100
2206 ms4296 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;

const int K=1900;

int n,m,t;
int lef[200023],rig[200023];
int id,lastans=0;
int p[200023],pl[200023],pr[200023];
vector<int>v;

void build(){
	sort(p,p+m,[&](const int &x,const int &y){
		return (rig[x]-lef[x])<(rig[y]-lef[y]);
	});
	for(int i=0;i<m;i++){
		pr[i]=pl[i]=p[i];
	}
	for(int i=0;i<m;i+=K){
		sort(pl+i,pl+min(i+K,m),[&](const int &x,const int &y){
			return lef[x]>lef[y];
		});
		sort(pr+i,pr+min(i+K,m),[&](const int &x,const int &y){
			return rig[x]<rig[y];
		});
	}
}

int main(){
	ios_base::sync_with_stdio(false);cin.tie(NULL);
	cin>>n>>t;
	iota(p,p+n,1);
	for(int ii=1;ii<=n;ii++){
		if(ii%K==0){
			m=id;
			for(int x:v){
				lef[x]=-1;
				rig[x]=-2;
			}
			v.clear();
			build();
		}
		int c;cin>>c;
		if(c==1){
			id++;
			cin>>lef[id]>>rig[id];
			lef[id]^=(t*lastans);
			rig[id]^=(t*lastans);
			if(lef[id]>rig[id])swap(lef[id],rig[id]);
		}
		else if(c==2){
			int x;cin>>x;
			v.pb(x);
		}
		else{
			int l,r,k;cin>>l>>r>>k;
			l^=(t*lastans);
			r^=(t*lastans);
			if(l>r)swap(l,r);
			lastans=0;
			for(int i=m+1;i<=id;i++){
				if(min(r,rig[i])-max(l,lef[i])<k-1)continue;
				lastans++;
			}
			for(int i:v){
				if(min(r,rig[i])-max(l,lef[i])<k-1)continue;
				lastans--;
			}
			for(int i=0;i<m;i+=K){
				int j=min(i+K-1,m-1);
				if(rig[p[j]]-lef[p[j]]<k-1)continue;
				if(rig[p[i]]-lef[p[i]]<k-1){
					for(int o=i;o<=j;o++){
						if(min(r,rig[p[o]])-max(l,lef[p[o]])<k-1)continue;
						lastans++;
					}
					continue;
				}
				lastans+=j-i+1;
				int le=i,ri=j+1;
				while(le<ri){
					int mi=(le+ri)/2;
					if(lef[pl[mi]]>r-k+1)le=mi+1;
					else ri=mi;
				}
				lastans-=le-i;
				le=i;ri=j+1;
				while(le<ri){
					int mi=(le+ri)/2;
					if(rig[pr[mi]]<l+k-1)le=mi+1;
					else ri=mi;
				}
				lastans-=le-i;
			}
			cout<<lastans<<endl;
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...