#include<bits/stdc++.h>
using namespace std;
#define task "a"
#define se second
#define fi first
#define ll long long
#define ii pair<ll, ll>
const long mxN = 25e4 + 7;
struct node
{
    ll sum, pen, inc;
};
int n, m, q, c[mxN];
ll ans[mxN];
node tree[mxN * 4];
vector<ii> vc[mxN], querry[mxN];
node Merge(node u, node v)
{
    node res;
    res.sum = u.sum + v.sum;
    res.pen = min(u.pen, u.sum + v.pen);
    res.inc = u.inc + v.inc;
    return res;
}
void Upd(int vt, int val, int j = 1, int l = 1, int r = q)
{
    if (l > vt || vt > r)
        return;
    if (l == r)
    {
        tree[j].sum = val;
        tree[j].pen = min(0, val);
        tree[j].inc = max(0, val);
        return;
    }
    int mid = (l + r) / 2;
    Upd(vt, val, j * 2, l, mid);
    Upd(vt, val, j * 2 + 1, mid + 1, r);
    tree[j] = Merge(tree[j * 2], tree[j * 2 + 1]);
}
node Get(int vt, int j = 1, int l = 1, int r = q)
{
    if (vt < l)
        return node();
    if (r <= vt)
        return tree[j];
    int mid = (l + r) / 2;
    return Merge(Get(vt, j * 2, l, mid), Get(vt, j * 2 + 1, mid + 1, r));
}
int Walk(ll& tmp, int j = 1, int l = 1, int r = q)
{
    if (tmp <= 0)
        return 0;
    if (tree[j].inc < tmp)
    {
        tmp -= tree[j].inc;
        return 0;
    }
    if (l == r)
    {
        tmp = 0;
        return c[l];
    }
    int mid = (l + r) / 2;
    int v = Walk(tmp, j * 2 + 1, mid + 1, r);
    int u = Walk(tmp, j * 2, l, mid);
    return max(u, v);
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    //freopen(task".INP", "r", stdin);
    //freopen(task".OUT", "w", stdout);
    cin >> n >> m >> q;
    for (int i = 1; i <= q; i++)
    {
        int tt;
        cin >> tt;
        if (tt == 1)
        {
            int l, r, num;
            cin >> l >> r >> c[i] >> num;
            vc[l].push_back({i, num});
            vc[r + 1].push_back({i, 0});
        }
        else if (tt == 2)
        {
            int l, r, num;
            cin >> l >> r >> num;
            vc[l].push_back({i, -num});
            vc[r + 1].push_back({i, 0});
        }
        else
        {
            ll vt, stt;
            cin >> vt >> stt;
            querry[vt].push_back({i, stt});
        }
        ans[i] = -1;
    }
    for (int i = 1; i <= n; i++)
    {
        for (ii j : vc[i])
            Upd(j.fi, j.se);
        for (ii j : querry[i])
        {
            node tmp = Get(j.fi);
            ll del = tmp.sum - tmp.pen - j.se + 1;
            ans[j.fi] = Walk(del);
        }
    }
    for (int i = 1; i <= q; i++)
        if (ans[i] >= 0)
            cout << ans[i] << '\n';
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |