제출 #670927

#제출 시각아이디문제언어결과실행 시간메모리
670927Kahou푸드 코트 (JOI21_foodcourt)C++14
13 / 100
1092 ms132160 KiB
/* In the name of God, aka Allah */
// let this be mytemp.cpp
#include<bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define endl '\n'
#define mk make_pair
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int N = 2.5e5 + 50;
ll n, m, q, out[N];
vector<pll> qr[N];
vector<pll> bd[N<<2];
vector<pair<ll, pll>> vc[N<<2];
pll fen[N];

void join(ll l, ll r, ll c, ll k, ll tim, ll u=1, ll tl=1, ll tr=n) {
	if (r < tl || tr < l) return;
	if (l <= tl && tr <= r) {
		vc[u].push_back({tim, {k, c}});
		return;
	}
	ll md = (tl+tr)/2;
	ll lc = u<<1;
	ll rc = u<<1|1;
	join(l, r, c, k, tim, lc, tl, md), join(l, r, c, k, tim, rc, md+1, tr);
}
void leave(ll l, ll r, ll k, ll tim, ll u=1, ll tl=1, ll tr=n) {
	if (r < tl || tr < l) return;
	if (l <= tl && tr <= r) {
		bd[u].push_back({tim, k});
		return;
	}
	ll md = (tl+tr)/2;
	ll lc = u<<1;
	ll rc = u<<1|1;
	leave(l, r, k, tim, lc, tl, md), leave(l, r, k, tim, rc, md+1, tr);
}
void service(ll id, ll x, ll tim, ll u=1, ll tl=1, ll tr=n) {
	if (id < tl || tr < id) return;
	if (tl == tr) {
		qr[tl].push_back({tim, x});
		return;
	}
	ll md = (tl+tr)/2;
	ll lc = u<<1;
	ll rc = u<<1|1;
	service(id, x, tim, lc, tl, md), service(id, x, tim, rc, md+1, tr);
}

void upd(ll i, ll x) {
	if (!i) return fen[i].F += x, void();
	for (; i < N; i += i&-i) {
		fen[i].F += x;
	}
}
ll get(ll x) {
	ll id = 0;
	x -= fen[0].F;
	for (ll k = 18; k >= 0; k--) {
		if (id+(1<<k) < N && fen[id^(1<<k)].F < x) {
			id ^= (1<<k);
			x -= fen[id].F;
		}
	}
	id++;
	return id;
}

void dfs(ll u=1, ll tl=1, ll tr=n) {
	for (pll x: bd[u]) {
		upd(0, x.S);
	}
	for (pair<ll, pll> x:vc[u]) {
		fen[x.F].S = x.S.S;
		upd(x.F, x.S.F);
	}
	if (tl == tr) {
		for (pll x:qr[tl]) {
			ll id = get(x.S);
			cerr << "OK " << x.F << ' ' << x.S << ' ' << id << endl;
			out[x.F] = (id < x.F? fen[id].S : 0);
		}
	}
	ll md = (tl+tr)/2;
	ll lc = u<<1;
	ll rc = u<<1|1;
	if (tl < tr) dfs(lc, tl, md), dfs(rc, md+1, tr);

	for (pair<ll, pll> x:vc[u]) {
		fen[x.F].S = 0;
		upd(x.F, -x.S.F);
	}
	reverse(bd[u].begin(), bd[u].end());
	for (pll x: bd[u]) {
		upd(0, x.S);
	}
}

void solve() {
	cin >> n >> m >> q;
	for (ll i = 1; i <= q; i++) {
		out[i] = -1;
		ll t, l, r, k, c, id, x;
		cin >> t;
		if (t == 1) {
			cin >> l >> r >> c >> k;
			join(l, r, c, k, i);
		}
		if (t == 2) {
			cin >> l >> r >> k;
			leave(l, r, k, i);
		}
		if (t == 3) {
			cin >> id >> x;
			service(id, x, i);
		}
	}
	dfs();
	for (ll i = 1; i <= q; i++) {
		if (out[i] < 0) continue;
		cout << out[i] << endl;
	}
}
int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	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...