Submission #802404

#TimeUsernameProblemLanguageResultExecution timeMemory
802404DivaneFood Court (JOI21_foodcourt)C++17
24 / 100
340 ms51848 KiB
/* In the name of GOD */ #include <bits/stdc++.h> using namespace std; #define F first #define S second #define mk make_pair typedef long long ll; typedef long double ld; typedef pair <long long, long long> pii; const int N = 250012, SegN = (1 << 19); const long long INF = 1e18 + 31; pii lz[SegN]; ll slz[SegN]; int t[N], l[N], r[N], c[N], ans[N]; ll k[N], x[N]; vector <pair <ll, int>> v[N]; vector <pair <int, int>> s[N], e[N]; ll LZ[SegN]; ll MX[SegN]; void SHIFT (int v) { if (!LZ[v]) return; LZ[v << 1] += LZ[v]; LZ[v << 1 | 1] += LZ[v]; MX[v << 1] += LZ[v]; MX[v << 1 | 1] += LZ[v]; LZ[v] = 0; } void ADD (int l, int r, int x, int v = 1, int tl = 0, int tr = N - 1) { if (tl > r || l > tr) return; if (l <= tl && tr <= r) { LZ[v] += x; MX[v] += x; } else { SHIFT(v); int mid = (tl + tr) >> 1; ADD (l, r, x, v << 1, tl, mid); ADD (l, r, x, v << 1 | 1, mid + 1, tr); MX[v] = max(MX[v << 1], MX[v << 1 | 1]); } } int GET (int x, int v = 1, int tl = 0, int tr = N - 1) { if (x == -1) return 0; if (tl == tr) { return c[tl]; } SHIFT(v); int mid = (tl + tr) >> 1; if (MX[v << 1] >= x) { return GET (x, v << 1, tl, mid); } else { return GET (x, v << 1 | 1, mid + 1, tr); } } void shift (int v) { ll x = lz[v].F, y = lz[v].S; lz[v << 1].F += x; lz[v << 1].S += x; lz[v << 1 | 1].F += x; lz[v << 1 | 1].S += x; lz[v << 1].S = max(lz[v << 1].S, y); lz[v << 1 | 1].S = max(lz[v << 1 | 1].S, y); slz[v << 1] += slz[v]; slz[v << 1 | 1] += slz[v]; lz[v] = mk(0, -INF); slz[v] = 0; } void mx (int l, int r, int v = 1, int tl = 0, int tr = N - 1) { if (tl > r || l > tr) return; if (l <= tl && tr <= r) { lz[v].S = max(lz[v].S, 0LL); } else { shift(v); int mid = (tl + tr) >> 1; mx (l, r, v << 1, tl, mid); mx (l, r, v << 1 | 1, mid + 1, tr); } } void add (int l, int r, int x, int v = 1, int tl = 0, int tr = N - 1) { // cout << l << ' ' << r << ' ' << x << ' ' << v << ' ' << tl << ' ' << tr << '\n'; if (tl > r || l > tr) return; if (l <= tl && tr <= r) { //cout << "wef\n"; slz[v] += max(0, x); lz[v].S += x; lz[v].F += x; //cout << lz[v].F << ' ' << lz[v].S << '\n'; } else { shift(v); int mid = (tl + tr) >> 1; add (l, r, x, v << 1, tl, mid); add (l, r, x, v << 1 | 1, mid + 1, tr); } } pii get (int i, int v = 1, int tl = 0, int tr = N - 1) { if (tl == tr) return mk(slz[v], max(lz[v].F, lz[v].S)); shift(v); int mid = (tl + tr) >> 1; if (i <= mid) return get (i, v << 1, tl, mid); return get (i, v << 1 | 1, mid + 1, tr); } int32_t main () { ios::sync_with_stdio(false); cin.tie(); for (int v = 0; v < SegN; v++) lz[v] = mk(0, -INF); int n, m, q; cin >> n >> m >> q; for (int i = 0; i < q; i++) { ans[i] = -1; cin >> t[i]; if (t[i] == 1) { cin >> l[i] >> r[i] >> c[i] >> k[i]; s[l[i]].push_back(mk(i, k[i])); e[r[i]].push_back(mk(i, k[i])); add (l[i], r[i], k[i]); } else if (t[i] == 2) { cin >> l[i] >> r[i] >> k[i]; add (l[i], r[i], -k[i]); mx (l[i], r[i]); } else { cin >> l[i] >> k[i]; pii p = get (l[i]); if (k[i] > p.S) { x[i] = -1; } else { x[i] = p.F - p.S + k[i]; } v[l[i]].push_back(mk(x[i], i)); } } // FFFFFFFFFFFFFFFINALY for (int i = 1; i <= n; i++) { for (auto [tt, kk] : s[i]) { ADD (tt, N - 1, kk); } for (auto [j, ii] : v[i]) ans[ii] = GET (j); for (auto [tt, kk] : e[i]) { ADD (tt, N - 1, -kk); } } for (int i = 0; i < q; i++) { if (ans[i] >= 0) 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...