Submission #540513

#TimeUsernameProblemLanguageResultExecution timeMemory
540513alvingogoFood Court (JOI21_foodcourt)C++14
100 / 100
797 ms92888 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define AquA cin.tie(0);ios_base::sync_with_stdio(0);
#define fs first
#define sc second
#define cd complex<double>
#define p_q priority_queue
#define int long long
using namespace std;
 
typedef pair<int,int> pii;
struct qu{
	int t;
	int l,r,c,k;
};
struct qu2{
	int t,p,k;
	int id;
};
bool cmp(qu2 a,qu2 b){
	if(a.p!=b.p){
		return a.p<b.p;
	}
	return a.t<b.t;
}
vector<qu> vq;
struct DS{
	struct no{
		vector<int> tag;
		int cnt=0;
	};
	vector<no> st;
	vector<int> kk;
	void init(int n){
		st.resize(4*n);
		kk.resize(n);
	}
	void upd(int v,int x){
		while(st[v].tag.size()){
			int y=st[v].tag.back();
			if(y<0 && x>0){
				break;
			}
			if(y>0 && x<0){
				st[v].cnt+=min(abs(y),abs(x));
				x+=y;
			}
			else{
				x+=y;
			}
			st[v].tag.pop_back();
		}
		if(x!=0){
			st[v].tag.push_back(x);
		}
	}
	void pudo(int v){
		st[2*v+1].cnt+=st[v].cnt;
		st[2*v+2].cnt+=st[v].cnt;
		for(auto y:st[v].tag){
			upd(2*v+1,y);
			upd(2*v+2,y);
		}
		st[v].cnt=0;
		st[v].tag.clear();
	}
	void update(int v,int L,int R,int l,int r,int k){
		if(l==L && r==R){
			upd(v,k);
			return;
		}
		pudo(v);
		int m=(L+R)/2;
		if(r<=m){
			update(2*v+1,L,m,l,r,k);
		}
		else if(l>m){
			update(2*v+2,m+1,R,l,r,k);
		}
		else{
			update(2*v+1,L,m,l,m,k);
			update(2*v+2,m+1,R,m+1,r,k);
		}
	}
	int query(int v,int L,int R,int pos){
		if(L==R){
			for(auto h:st[v].tag){
				if(h<0 && kk[L]>0){
					st[v].cnt+=min(abs(h),abs(kk[L]));
				}
				kk[L]+=h;
				kk[L]=max(kk[L],0ll);
			}
			st[v].tag.clear();
			return st[v].cnt;
		}
		pudo(v);
		int m=(L+R)/2;
		if(pos<=m){
			return query(2*v+1,L,m,pos);
		}
		else{
			return query(2*v+2,m+1,R,pos);
		}
	}
	void pre(int n){
		for(auto &h:vq){
			if(h.t==1){
				update(0,0,n-1,h.l,h.r,h.k);
			}
			else if(h.t==2){
				update(0,0,n-1,h.l,h.r,-h.k);
			}
			else{
				h.k+=query(0,0,n-1,h.l);
			}
		}
	}
};
struct Q13{
	vector<int> st;
	vector<qu2> g;
	void update(int v,int L,int R,int pos,int k){
		if(L==R){
			st[v]+=k;
			return;
		}
		int m=(L+R)/2;
		if(pos<=m){
			update(2*v+1,L,m,pos,k);
		}
		else{
			update(2*v+2,m+1,R,pos,k);
		}
		st[v]=st[2*v+1]+st[2*v+2];
	}
	int query(int v,int L,int R,int k){
		if(L==R){
			return L;
		}
		int m=(L+R)/2;
		if(st[2*v+1]>=k){
			return query(2*v+1,L,m,k);
		}
		else{
			return query(2*v+2,m+1,R,k-st[2*v+1]);
		}
	}
	void solve(int q){
		vector<int> ans(q,-1);
		vector<int> co(q,-1);
		st.resize(4*(q+1));
		for(int i=0;i<q;i++){
			if(vq[i].t==1){
				g.push_back({1,vq[i].l,vq[i].k,i});
				g.push_back({1,vq[i].r+1,-vq[i].k,i});
				co[i]=vq[i].c;
			}
			else if(vq[i].t==3){
				g.push_back({3,vq[i].l,vq[i].k,i});
			}
		}
		sort(g.begin(),g.end(),cmp);
		for(auto h:g){
			if(h.t==1){
				update(0,0,q,h.id,h.k);
			}
			else{
				int u=query(0,0,q,h.k);
				if(u>h.id){
					ans[h.id]=0;
				}
				else{
					ans[h.id]=co[u];
				}
			}
		}
		for(auto y:ans){
			if(y>=0){
				cout << y << "\n";
			}
		}
	}
};
signed main(){
	AquA;
	int n,m,q;
	cin >> n >> m >> q;
	vq.resize(q);
	for(int i=0;i<q;i++){
		cin >> vq[i].t;
		if(vq[i].t==1){
			cin >> vq[i].l >> vq[i].r >> vq[i].c >> vq[i].k;
			vq[i].l--;
			vq[i].r--;
		}
		else if(vq[i].t==2){
			cin >> vq[i].l >> vq[i].r >> vq[i].k;
			vq[i].l--;
			vq[i].r--;
		}
		else{
			cin >> vq[i].l >> vq[i].k;
			vq[i].l--;
		}
	}
	DS ds;
	ds.init(n);
	ds.pre(n);
	Q13 ss;
	ss.solve(q);
	return 0;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...