Submission #813443

#TimeUsernameProblemLanguageResultExecution timeMemory
813443ParsaSFood Court (JOI21_foodcourt)C++17
2 / 100
61 ms32996 KiB
// In the name of God
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define mp make_pair
typedef long long ll;
const int N = 25e4 + 5;
int n, m, q;
int C[N];
vector<int> vadd[N], vrem[N], vec;
vector<pair<int, int > > qr[N];
int ans[N];
int S[N << 2];

struct node {
    int rem, cnt, ex;
    node() {
        rem = cnt = ex = 0;
    }
    void clear() {
        cnt = rem = ex = 0;
    }
} seg[N << 2];

void shift(int v, int tl, int tr) {
    if (tl == tr)
        return;
    int lc = v << 1, rc = v << 1 | 1;
    seg[lc].ex += max(0, seg[v].ex - seg[lc].cnt);
    seg[lc].rem += seg[v].rem + min(seg[v].ex, seg[lc].cnt);
    seg[lc].cnt = seg[v].cnt + max(0, seg[lc].cnt - seg[v].ex);
    seg[rc].ex += max(0, seg[v].ex - seg[rc].cnt);
    seg[rc].rem += seg[v].rem + min(seg[v].ex, seg[rc].cnt);
    seg[rc].cnt = seg[v].cnt + max(0, seg[rc].cnt - seg[v].ex);

    seg[v].clear();
}

void ADD(int l, int r, int c, int v = 1, int tl = 1, int tr = n) {
    shift(v, tl, tr);
    if (l > tr || r < tl)
        return;
    if (tl >= l && tr <= r) {
        seg[v].cnt += c;
        return;
    }
    int mid = (tl + tr) >> 1;
    ADD(l, r, c, v << 1, tl, mid);
    ADD(l, r, c, v << 1 | 1, mid + 1, tr);
}
void REM(int l, int r, int c, int v = 1, int tl = 1, int tr = n) {
    shift(v, tl, tr);
    if (l > tr || r < tl) {
        return;
    }
    if (tl >= l && tr <= r) {
        if (tl == tr) {
            int k = min(seg[v].cnt, c);
            seg[v].cnt -= k;
            seg[v].rem += k;
            seg[v].ex += c - k;
        }
        else
            seg[v].ex += c;
        return;
    }
    int mid = (tl + tr) >> 1;
    REM(l, r, c, v << 1, tl, mid);
    REM(l, r, c, v << 1 | 1, mid + 1, tr);
}
node query(int i, int v = 1, int tl = 1, int tr = n) {
    shift(v, tl, tr);
    if (tl == tr) {
        return seg[v];
    }
    int mid = (tl + tr) >> 1;
    if (i <= mid)
        return query(i, v << 1, tl, mid);
    return query(i, v << 1 | 1, mid + 1, tr);
}

void upd(int i, int val, int v = 1, int tl = 0, int tr = (int)vec.size()) {
    if (tl == tr) {
        S[v] += val;
        return;
    }
    int mid = (tl + tr) >> 1;
    if (i <= mid)
        upd(i, val, v << 1, tl, mid);
    else
        upd(i, val, v << 1 | 1, mid + 1, tr);
    S[v] = S[v << 1] + S[v << 1 | 1];
}
int query2(int x, int v = 1, int tl = 0, int tr = (int)vec.size()) {
    if (tl == tr)
        return tl;
    int mid = (tl + tr) >> 1;
    if (S[v << 1] >= x)
        return query2(x, v << 1, tl, mid);
    return query2(x - S[v << 1], v << 1 | 1, mid + 1, tr);
}


void solve() {
    cin >> n >> m >> q;
    for (int i = 0; i < q; i++) {
        ans[i] = -1;
        int t; cin >> t;
        if (t == 1) {
            int l, r, c, k; cin >> l >> r >> k >> c;
            C[(int)vec.size()] = c;
            vadd[l].pb((int)vec.size());
            vrem[r + 1].pb((int)vec.size());
            vec.pb(k);

            ADD(l, r, c);
        }
        else if (t == 2) {
            int l, r, c; cin >> l >> r >> c;
            REM(l, r, c);

        }
        else {
            int a, b; cin >> a >> b;
            node v = query(a);
            if (v.cnt < b) {
                ans[i] = 0;
            }
            else {
                qr[a].pb(mp(v.rem + b, i));
            }
        }
        continue;
        for (int j = 1; j <= n; j++) {
            node u = query(j);
            cout << u.cnt << ' ';
        }
        cout << endl;
        node u = query(1);
        cout << u.cnt << ' ' << u.rem << ' ' << u.ex << endl;
    }
    for (int i = 1; i <= n; i++) {
        for (auto x : vadd[i]) {
            upd(x, C[x]);
        }
        for (auto x : vrem[i]) {
            upd(x, -C[x]);
        }
        for (auto [c, j] : qr[i]) {
            ans[j] = vec[query2(c)];
        }
    }
    for (int i = 0; i < q; i++) {
        if (ans[i] != -1)
            cout << ans[i] << '\n';
    }
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    solve();
}
#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...