Submission #1198133

#TimeUsernameProblemLanguageResultExecution timeMemory
1198133yellowtoadFood Court (JOI21_foodcourt)C++20
0 / 100
230 ms49768 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#define f first
#define s second
#define int long long
using namespace std;

int n, m, q;
vector<pair<pair<int,int>,int>> query[250010], op[250010];
vector<int> ans;

struct {
	struct {
		pair<int,int> minn;
		int lz;
	} node[1000010];
	
	void build(int id, int x, int y) {
		if (x == y) {
			node[id].minn = {0,x};
			return;
		}
		int mid = (x+y)/2;
		build(id*2,x,mid);
		build(id*2+1,mid+1,y);
		node[id].minn = min(node[id*2].minn,node[id*2+1].minn);
	}
	
	void split(int id) {
		node[id*2].minn.f += node[id].lz;
		node[id*2+1].minn.f += node[id].lz;
		node[id*2].lz += node[id].lz;
		node[id*2+1].lz += node[id].lz;
		node[id].lz = 0;
	}
	
	void update(int id, int x, int y, int pos, int val) {
		if (pos <= x) {
			node[id].minn.f += val;
			node[id].lz += val;
			return;
		}
		if (y < pos) return;
		int mid = (x+y)/2;
		split(id);
		update(id*2,x,mid,pos,val);
		update(id*2+1,mid+1,y,pos,val);
		node[id].minn = min(node[id*2].minn,node[id*2+1].minn);
	}
	
	pair<int,int> find(int id, int x, int y, int l, int r) {
		if ((l <= x) && (y <= r)) return node[id].minn;
		if ((y < l) || (r < x)) return {1e18,1e18};
		int mid = (x+y)/2;
		split(id);
		return min(find(id*2,x,mid,l,r),find(id*2+1,mid+1,y,l,r));
	}
} seg;

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin >> n >> m >> q;
	for (int i = 1; i <= q; i++) {
		int type, l, r, c, k;
		cin >> type;
		if (type == 1) {
			cin >> l >> r >> c >> k;
			op[l].push_back({{k,c},i});
			op[r+1].push_back({{-k,c},i});
		} else if (type == 2) {
			cin >> l >> r >> k;
			op[l].push_back({{-k,0},i});
			op[r+1].push_back({{k,0},i});
		} else {
			cin >> l >> k;
			query[l].push_back({{k,i},ans.size()});
			ans.push_back(1);
		}
	}
	seg.build(1,1,q);
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j < op[i].size(); j++) {
			seg.update(1,1,q,op[i][j].s,op[i][j].f.f);
		}
		for (int j = 0; j < query[i].size(); j++) {
			int pos = query[i][j].f.s;
			pair<int,int> tmp = seg.find(1,1,q,1,pos);
			if (seg.find(1,1,q,pos,pos).f-tmp.f < query[i][j].f.f) ans[query[i][j].s] = 0;
		}
	}
	for (int i = 0; i < ans.size(); 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...