Submission #1311543

#TimeUsernameProblemLanguageResultExecution timeMemory
1311543namhhFood Court (JOI21_foodcourt)C++20
100 / 100
555 ms44248 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
const int N = 250005;
int n,m,q,bits[N],st[4*N],lazy[4*N],lazymx[4*N],base[N],pos[N],pos2[N],l[N],r[N],ans[N],lim = 0,lim2 = 0;
vector<int>v[N];
struct query{
	int type,l,r,c,k;
};
query qr[N];
void update(int u, int val){
	while(u <= n){
		bits[u] += val;
		u += u & (-u);
	}
}
int get(int u){
	int sum = 0;
	while(u > 0){
		sum += bits[u];
		u -= u & (-u);
	}
	return sum;
}
void down(int id){
	if(lazy[id] != 0){
		st[2*id] += lazy[id];
		st[2*id+1] += lazy[id];
		lazy[2*id] += lazy[id];
		lazy[2*id+1] += lazy[id];
		if(lazymx[2*id] != -1) lazymx[2*id] += lazy[id];
		if(lazymx[2*id+1] != -1) lazymx[2*id+1] += lazy[id];
		lazy[id] = 0;
	}
	if(lazymx[id] != -1){
		st[2*id] = max(st[2*id],lazymx[id]);
		st[2*id+1] = max(st[2*id+1],lazymx[id]);
		lazymx[2*id] = max(lazymx[2*id],lazymx[id]);
		lazymx[2*id+1] = max(lazymx[2*id+1],lazymx[id]);
		lazymx[id] = -1;
	}
}
void add(int id, int l, int r, int u, int v, int val){
	if(l > v || r < u) return;
	if(l >= u && r <= v){
		st[id] += val;
		lazy[id] += val;
		if(lazymx[id] != -1) lazymx[id] += val;
		return;
	}
	down(id);
	int mid = (l+r)/2;
	add(2*id,l,mid,u,v,val);
	add(2*id+1,mid+1,r,u,v,val);
	st[id] = max(st[2*id],st[2*id+1]);
}
void update(int id, int l, int r, int u, int v, int val){
	if(l > v || r < u) return;
	if(l >= u && r <= v){
		st[id] = max(st[id],val);
		lazymx[id] = max(lazymx[id],val);
		return;
	}
	down(id);
	int mid = (l+r)/2;
	update(2*id,l,mid,u,v,val);
	update(2*id+1,mid+1,r,u,v,val);
	st[id] = max(st[2*id],st[2*id+1]);
}
int get(int id, int l, int r, int i){
	if(l == r) return st[id];
	int mid = (l+r)/2;
	down(id);
	if(i <= mid) return get(2*id,l,mid,i);
	return get(2*id+1,mid+1,r,i);
}
signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n >> m >> q;
	for(int i = 1; i <= 4*n; i++) lazymx[i] = -1;
	for(int i = 1; i <= q; i++){
		cin >> qr[i].type >> qr[i].l >> qr[i].r;
		if(qr[i].type == 1){
			cin >> qr[i].c >> qr[i].k;
			++lim;
			pos[lim] = i;
			update(qr[i].l,qr[i].k);
		    update(qr[i].r+1,-qr[i].k);
		    add(1,1,n,qr[i].l,qr[i].r,qr[i].k);
		}
		if(qr[i].type == 2){
		    cin >> qr[i].k;
		    update(1,1,n,qr[i].l,qr[i].r,qr[i].k);
		    add(1,1,n,qr[i].l,qr[i].r,-qr[i].k);
		}
		if(qr[i].type == 3){
			++lim2;
		    l[lim2] = 1;
		    r[lim2] = lim;
		    pos2[lim2] = i;
		    base[lim2] = get(qr[i].l)-get(1,1,n,qr[i].l);
		}
	}
	while(true){
		int cnt = 0;
		for(int i = 1; i <= n; i++) bits[i] = 0;
		for(int i = 1; i <= lim; i++) v[i].clear();
		for(int i = 1; i <= lim2; i++){
			if(l[i] <= r[i]){
				cnt++;
				v[(l[i]+r[i])/2].push_back(i);
			}
		}
		if(cnt == 0) break;
		for(int i = 1; i <= lim; i++){
			int id = pos[i];
			update(qr[id].l,qr[id].k);
			update(qr[id].r+1,-qr[id].k);
			for(int qq: v[i]){
				int idd = pos2[qq];
				int val = get(qr[idd].l);
				if(val >= base[qq]+qr[idd].r){
					ans[qq] = qr[id].c;
					r[qq] = i-1;
				}
				else l[qq] = i+1;
			}
		}
	}
	for(int i = 1; i <= lim2; i++) 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...