Submission #711775

#TimeUsernameProblemLanguageResultExecution timeMemory
711775minhcoolFood Court (JOI21_foodcourt)C++17
100 / 100
518 ms91316 KiB
#include<bits/stdc++.h>
 
using namespace std; 
 
#define int long long
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define foru(i, l, r) for(int i = l; i <= r; i++)
#define ford(i, r, l) for(int i = r; i >= l; i--)
#define eb emplace_back
 
typedef pair<int, int> ii;
typedef pair<ii, int> iii;
typedef pair<ii, ii> iiii;
 
const int N = 4e5 + 5, MAXN = 1e7 + 5;
 
const long long oo = 1e9 + 7, mod = 1e9 + 7;
 
/*
upd[]: content of ith update
in[] -> if the ith query is in the segtree
ques[] -> queries that begin/end at i
ask[] -> "service" queries
*/
 
int n, m, q;
 
ii upd[N];
bool in[N];
vector<int> ques[N];
vector<ii> ask[N];
 
struct node{
	int mn_pref = oo, mn_pos = 0;
	int tol_plus = 0, tol_minus = 0;
	node(){}
};
 
node IT[N << 2];
 
node merge(node a, node b){
	node c;
	c.mn_pref = min(a.mn_pref, a.tol_plus - a.tol_minus + b.mn_pref);
	c.mn_pos = ((c.mn_pref == a.mn_pref) ? a.mn_pos : b.mn_pos); 
	c.tol_plus = a.tol_plus + b.tol_plus;
	c.tol_minus = a.tol_minus + b.tol_minus;
	return c;
}
 
void update(int id, int l, int r, int pos, bool add){
	if(l == r){
		//cout << l << " " << r << " " << pos << " " << id << "\n";
		IT[id].mn_pref = IT[id].tol_plus = IT[id].tol_minus = 0;
		IT[id].mn_pos = l;
		if(!add) return;
		if(upd[pos].se == 0){
			IT[id].mn_pref = -upd[pos].fi;
			IT[id].tol_minus = upd[pos].fi;
		}
		else{
			IT[id].mn_pref = upd[pos].fi;
			IT[id].tol_plus = upd[pos].fi;
		}
		return;
	}
	int mid = (l + r) >> 1;
	if(mid >= pos) update(id << 1, l, mid, pos, add);
	else update(id << 1 | 1, mid + 1, r, pos, add);
	IT[id] = merge(IT[id << 1], IT[id << 1 | 1]);
}
 
node zero;
 
node get(int id, int l, int r, int L, int R){
	if(l > R || r < L) return zero;
	if(l >= L && r <= R) return IT[id];
	int mid = (l + r) >> 1;
	return merge(get(id << 1, l, mid, L, R), get(id << 1 | 1, mid + 1, r, L, R));
}
 
int bins(int id, int l, int r, int rem){
	if(l == r){
		if(rem > IT[id].tol_plus) return -1;
		return l;
	}
	int mid = (l + r) >> 1;
	if(IT[id << 1].tol_plus >= rem) return bins(id << 1, l, mid, rem);
	else return bins(id << 1 | 1, mid + 1, r, rem - IT[id << 1].tol_plus);
}
 
int ans[N];
 
void process(){
	cin >> n >> m >> q;
	for(int i = 1; i <= q; i++){
		int t, l, r, k, c = 0, a, b;
		cin >> t;
		if(t == 1) cin >> l >> r >> c >> k;
		else if(t == 2) cin >> l >> r >> k;
		else cin >> a >> b;
		//cout << t << "\n";
		if(t <= 2){
			upd[i] = {k, c};
			ques[l].pb(i);
			ques[r + 1].pb(i);
		}
		else{
			ask[a].pb({i, b});
		}
	}
	//cout << "OK\n";
	//return;
	for(int i = 1; i <= n; i++){
		for(auto it : ques[i]){
			//continue;
			in[it] ^= 1;
			update(1, 1, q, it, in[it]);
		}
		//for(int j = 1; j <= q; j++) cout << get(1, 1, q, j, j).tol_plus << "\n";
		for(auto it : ask[i]){
			//continue;
			node temp = get(1, 1, q, 1, it.fi);
			if(temp.mn_pref > 0){
				temp.mn_pref = temp.mn_pos = 0;
			}
			//cout << temp.mn_pos << "\n";
			//cout << i << " " << it.fi << " " << temp.tol_plus << " " << temp.tol_minus << "\n";
			node temp2 = get(1, 1, q, temp.mn_pos + 1, it.fi);
			int tol_pluss = temp.tol_plus - temp2.tol_plus;
			int posi = bins(1, 1, q, it.se + tol_pluss + temp2.tol_minus);
			//cout << it.se << " " << tol_pluss << " " << temp2.tol_minus << "\n";
			if(posi < 0 || posi > it.fi) ans[it.fi] = 0;
			else ans[it.fi] = upd[posi].se;
		}
	}
	for(int i = 1; i <= q; i++){
		if(upd[i].fi) continue;
		cout << ans[i] << "\n";
	}
}
 
signed main(){
	ios_base::sync_with_stdio(0);
 
	#ifdef nqm
		freopen("input.inp", "r", stdin);
		freopen("output.out", "w", stdout);
	#endif
	#ifndef nqm
		
	#endif
 
	process();
}
#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...