Submission #1314890

#TimeUsernameProblemLanguageResultExecution timeMemory
1314890i271828Sweeping (JOI20_sweeping)C++20
1 / 100
6691 ms2162688 KiB
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;

const int MAX=2e6+5;
int N,M,Q;
int rt[MAX];

struct SOL{
	int s,e,m,d;
	SOL *l=0,*r=0;
	map<pii,vector<int>> X,Y;
	unordered_map<int,int> xpar,ypar,xv,yv;
	SOL(int s,int e):s(s),e(e),m((s+e)>>1),d(e-s+1){}
	void cc(){
		if (d>1){
			if (!l) l=new SOL(s,m-1);
			if (!r) r=new SOL(m+1,e);
		}
	}
	void add(int i,int x,int y){
		cc();
		if (d>1){
			if (x>m) return r->add(i,x,y);
			if (y>N-m) return l->add(i,x,y);
		}
		rt[i]=m;
		xpar[i]=ypar[i]=i;
		xv[i]=x,yv[i]=y;
		X[{x,i}]={i};
		Y[{y,i}]={i};
	}
	void updx(int x){
		cc();
		if (x>m){
			while (Y.size()&&Y.begin()->first.first<=N-x){
				auto st=Y.begin()->second;
				auto par=Y.begin()->first.second;
				Y.erase(Y.begin());
				for (auto i:st){
					if (rt[i]!=m) continue;
					r->add(i,x,yv[par]);
					xpar.erase(i),ypar.erase(i);
				}
				yv.erase(par);
			}
			if (d>1) r->updx(x);
		}else{
			int par=-1;
			vector<int> rst;
			vector<vector<int>> V;
			while (X.size()&&X.begin()->first.first<=x){
				auto st=X.begin()->second;
				auto p=X.begin()->first.second;
				X.erase(X.begin());
				if (st.size()>rst.size()) swap(st,rst),par=p;
				V.push_back(st);
			}
			while (V.size()){
				auto st=V.back();
				V.pop_back();
				for (auto i:st) if (rt[i]==m) rst.push_back(i),xpar[i]=par;
			}
			if (par!=-1){
				xv[par]=x;
				X[{x,par}]=rst;
			}
			if (d>1) l->updx(x);
		}
	}
	void updy(int y){
		cc();
		if (y>N-m){
			while (X.size()&&X.begin()->first.first<=N-y){
				auto st=X.begin()->second;
				auto par=X.begin()->first.second;
				X.erase(X.begin());
				for (auto i:st){
					if (rt[i]!=m) continue;
					l->add(i,xv[par],y);
					xpar.erase(i),ypar.erase(i);
				}
				xv.erase(par);
			}
			if (d>1) l->updy(y);
		}else{
			int par=-1;
			vector<int> rst;
			vector<vector<int>> V;
			while (Y.size()&&Y.begin()->first.first<=y){
				auto st=Y.begin()->second;
				auto p=Y.begin()->first.second;
				Y.erase(Y.begin());
				if (st.size()>rst.size()) swap(st,rst),par=p;
				V.push_back(st);
			}
			while (V.size()){
				auto st=V.back();
				V.pop_back();
				for (auto i:st) if (rt[i]==m) rst.push_back(i),ypar[i]=par;
			}
			if (par!=-1){
				yv[par]=y;
				Y[{y,par}]=rst;
			}
			if (d>1) r->updy(y);
		}
	}
	pii qry(int i){
		if (rt[i]>m) return r->qry(i);
		if (rt[i]<m) return l->qry(i);
		return {xv[xpar[i]],yv[ypar[i]]};
	}
};

int main(){
	ios::sync_with_stdio(0);cin.tie(0);
	cin>>N>>M>>Q;
	auto sol=new SOL(0,N);
	for (int i=0;i<M;i++){
		int x,y;cin>>x>>y;
		sol->add(i,x,y);
	}
	int c=M;
	while (Q--){
		int t;
		cin>>t;
		if (t==1){
			int i;cin>>i;i--;
			auto ans=sol->qry(i);
			cout<<ans.first<<' '<<ans.second<<'\n';
		}else if (t==2){
			int x;cin>>x;
			sol->updx(N-x);
		}else if (t==3){
			int y;cin>>y;
			sol->updy(N-y);
		}else{
			int x,y;cin>>x>>y;
			sol->add(c++,x,y);
		}
	}
}
#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...