Submission #1093902

#TimeUsernameProblemLanguageResultExecution timeMemory
1093902emptypringlescanFood Court (JOI21_foodcourt)C++17
100 / 100
538 ms91736 KiB
#include <bits/stdc++.h>
using namespace std;
struct node{
	int s,e,m;
	long long sumneg,val,ppl,lazy;
	int col;
	node *l,*r;
	node(int S, int E){
		s=S; e=E; m=(s+e)/2;
		sumneg=val=ppl=lazy=0;
		col=-1;
		if(s!=e){
			l=new node(s,m);
			r=new node(m+1,e);
		}
	}
	void prop(){
		if(s==e) return;
		if(lazy){
			l->val+=lazy;
			l->lazy+=lazy;
			r->val+=lazy;
			r->lazy+=lazy;
			lazy=0;
		}
	}
	void radd(int S, int E, long long V){
		if(S<=s&&e<=E){
			val+=V;
			lazy+=V;
			return;
		}
		prop();
		if(E<=m) l->radd(S,E,V);
		else if(S>m) r->radd(S,E,V);
		else l->radd(S,m,V),r->radd(m+1,E,V);
		val=min(l->val,r->val);
	}
	void sneg(int S, long long V){
		if(s==e){
			sumneg=V;
			return;
		}
		prop();
		if(S<=m) l->sneg(S,V);
		else r->sneg(S,V);
		sumneg=l->sumneg+r->sumneg;
	}
	void sppl(int S, long long V, int C){
		if(s==e){
			ppl=V;
			col=C;
			return;
		}
		prop();
		if(S<=m) l->sppl(S,V,C);
		else r->sppl(S,V,C);
		ppl=l->ppl+r->ppl;
	}
	long long qval(int S, int E){
		if(S<=s&&e<=E) return val;
		prop();
		if(E<=m) return l->qval(S,E);
		else if(S>m) return r->qval(S,E);
		else return min(l->qval(S,m),r->qval(m+1,E));
	}
	long long qsum(int S, int E){
		if(S<=s&&e<=E) return sumneg;
		prop();
		if(E<=m) return l->qsum(S,E);
		else if(S>m) return r->qsum(S,E);
		else return l->qsum(S,m)+r->qsum(m+1,E);
	}
	pair<int,int> bsta(long long V){
		if(s==e){
			//assert(V<=ppl||ppl==0);
			return {s,col};
		}
		prop();
		if(l->ppl>=V) return l->bsta(V);
		else return r->bsta(V-l->ppl);
	}
} *root;
int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n,m,q;
    cin >> n >> m >> q;
    long long ans[q];
    memset(ans,-1,sizeof(ans));
    vector<pair<int,pair<long long,int> > > st[n+5],en[n+5];
    vector<pair<int,long long> > st2[n+5],en2[n+5];
    vector<pair<int,long long> > qu[n+5];
    root=new node(0,q);
    for(int i=0; i<q; i++){
		int cmd;
		cin >> cmd;
		if(cmd==1){
			int l,r,c;
			long long k;
			cin >> l >> r >> c >> k;
			st[l].push_back({i,{k,c}});
			en[r].push_back({i,{k,c}});
		}
		else if(cmd==2){
			int l,r;
			long long k;
			cin >> l >> r >> k;
			st2[l].push_back({i,k});
			en2[r].push_back({i,k});
		}
		else{
			int a;
			long long b;
			cin >> a >> b;
			qu[a].push_back({i,b});
		}
	}
	for(int i=1; i<=n; i++){
		for(auto [x,y]:st[i]){
			root->sppl(x,y.first,y.second);
			root->radd(x,q,y.first);
		}
		for(auto [x,y]:st2[i]){
			root->sneg(x,y);
			root->radd(x,q,-y);
		}
		for(auto [x,y]:qu[i]){
			//cout << "hi";
			long long smol=root->qval(0,x);
			//cout << smol << ' ';
			long long off=root->qsum(0,x)+y;
			//cout << off << ' ';
			if(smol<0) off+=smol;
			pair<int,int> yey=root->bsta(off);
			//cout << yey.first << ',' << yey.second << ' ';
			if(yey.first>x) ans[x]=0;
			else ans[x]=yey.second;
			//cout << ans[x] << '\n';
		}
		for(auto [x,y]:en[i]){
			root->sppl(x,0,-1);
			root->radd(x,q,-y.first);
		}
		for(auto [x,y]:en2[i]){
			root->sneg(x,0);
			root->radd(x,q,y);
		}
	}
	for(int i=0; i<q; i++) if(ans[i]!=-1) cout << ans[i] << '\n';
}
#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...