This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
/*
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize("unroll-loops")
*/
#include <bits/stdc++.h>
#define int long long
using namespace std;
#define all(x) x.begin(), x.end()
#define len(x) ll(x.size())
#define eb emplace_back
#define PI acos(-1.0)
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define MIN(v) *min_element(all(v))
#define MAX(v) *max_element(all(v))
#define BIT(x, i) (1 & ((x) >> (i)))
#define MASK(x) (1LL << (x))
#define task "tnc"
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rep1(i, n) for (int i = 1; i <= (n); i++)
typedef long long ll;
typedef long double ld;
const ll INF = 1e18;
const int maxn = 1e6 + 5;
const int mod = 1e9 + 7;
const int mo = 998244353;
using pi = pair<ll, ll>;
using vi = vector<ll>;
using pii = pair<pair<ll, ll>, ll>;
mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
int n, m, q;
vector<pair<int, int>> d[maxn];
int pref[maxn];
vector<pair<int, int>> G[maxn];
struct seg
{
    pair<int, int> st[maxn * 4];
    int lazy[maxn * 4];
    int st1[maxn * 4];
    void push(int id)
    {
        st[id * 2].fi += lazy[id];
        st[id * 2 + 1].fi += lazy[id];
        lazy[id * 2] += lazy[id];
        lazy[id * 2 + 1] += lazy[id];
        lazy[id] = 0;
    }
    void build(int id, int l, int r)
    {
        st1[id] = 0;
        if (l == r)
        {
            st[id].se = l;
            return;
        }
        int mid = (l + r) / 2;
        build(id * 2, l, mid);
        build(id * 2 + 1, mid + 1, r);
        st[id] = min(st[id * 2], st[id * 2 + 1]);
    }
    void update(int id, int l, int r, int u, int v, int val)
    {
        if (r < u || v < l)
        {
            return;
        }
        if (u <= l && r <= v)
        {
            st[id].fi += val;
            lazy[id] += val;
            return;
        }
        int mid = (l + r) / 2;
        push(id);
        update(id * 2, l, mid, u, v, val);
        update(id * 2 + 1, mid + 1, r, u, v, val);
        st[id] = min(st[id * 2], st[id * 2 + 1]);
    }
    pair<int, int> get(int id, int l, int r, int u, int v)
    {
        if (r < u || v < l)
        {
            return {INF, 0};
        }
        if (u <= l && r <= v)
        {
            return st[id];
        }
        int mid = (l + r) / 2;
        push(id);
        return min(get(id * 2, l, mid, u, v), get(id * 2 + 1, mid + 1, r, u, v));
    }
    void push1(int id)
    {
        st1[id * 2] += lazy[id];
        st1[id * 2 + 1] += lazy[id];
        lazy[id * 2] += lazy[id];
        lazy[id * 2 + 1] += lazy[id];
        lazy[id] = 0;
    }
    void upd(int id, int l, int r, int u, int v, int val)
    {
        if (r < u || v < l)
        {
            return;
        }
        if (u <= l && r <= v)
        {
            st1[id] += val;
            lazy[id] += val;
            return;
        }
        int mid = (l + r) / 2;
        push1(id);
        upd(id * 2, l, mid, u, v, val);
        upd(id * 2 + 1, mid + 1, r, u, v, val);
        st1[id] = max(st1[id * 2], st1[id * 2 + 1]);
    }
    int getval(int id, int l, int r, int u)
    {
        if (l == r)
        {
            return st1[id];
        }
        int mid = (l + r) / 2;
        push1(id);
        if (u <= mid)
        {
            return getval(id * 2, l, mid, u);
        }
        else
            return getval(id * 2 + 1, mid + 1, r, u);
    }
    int get1(int id, int l, int r, int u, int val, int p)
    {
        if (r < u || val > st1[id] - p)
        {
            return -1;
        }
        int mid = (l + r) / 2;
        if (l == r)
        {
            return l;
        }
        push1(id);
        int x = get1(id * 2, l, mid, u, val, p);
        if (x != -1)
        {
            return x;
        }
        return get1(id * 2 + 1, mid + 1, r, u, val, p);
    }
} A, B;
int bit[maxn];
void upd(int id, int val)
{
    for (id; id <= q; id += id & (-id))
    {
        bit[id] += val;
    }
}
int get(int id)
{
    int res = 0;
    for (id; id >= 1; id -= id & (-id))
    {
        res += bit[id];
    }
    return res;
}
vector<pair<int, int>> era[maxn];
int pref1[maxn];
int que[maxn];
int ans[maxn];
signed main()
{
    cin.tie(0), cout.tie(0)->sync_with_stdio(0);
    cin >> n >> m >> q;
    for (int i = 1; i <= q; i++)
    {
        int t;
        cin >> t;
        if (t == 1)
        {
            int l, r, c, k;
            cin >> l >> r >> c >> k;
            que[i] = c;
            d[l].pb({i, k});
            d[r + 1].pb({i, -k});
        }
        else if (t == 2)
        {
            int l, r, k;
            cin >> l >> r >> k;
            era[l].pb({i, k});
            era[r + 1].pb({i, -k});
        }
        else if (t == 3)
        {
            int a, b;
            cin >> a >> b;
            G[a].pb({i, b});
        }
        ans[i] = -1;
    }
    A.build(1, 0, q);
    B.build(1, 0, q);
    for (int i = 1; i <= n; i++)
    {
        for (auto v : d[i])
        {
            A.update(1, 0, q, v.fi, q, v.se);
            B.upd(1, 0, q, v.fi, q, v.se);
        }
        for (auto v : era[i])
        {
            A.update(1, 0, q, v.fi, q, -v.se);
            upd(v.fi, v.se);
        }
        for (auto v : G[i])
        {
            pair<int, int> s = A.get(1, 0, q, 0, v.fi);
            int k = B.getval(1, 0, q, s.se);
            int num_era = get(v.fi) - get(s.se);
            int d = B.get1(1, 0, q, s.se, num_era + v.se, k);
            if (d >= v.fi)
            {
                ans[v.fi] = 0;
            }
            else
            {
                ans[v.fi] = que[d];
            }
        }
    }
    for (int i = 1; i <= q; i++)
    {
        if (ans[i] == -1)
            continue;
        cout << ans[i] << "\n";
    }
}
Compilation message (stderr)
foodcourt.cpp: In function 'void upd(long long int, long long int)':
foodcourt.cpp:162:10: warning: statement has no effect [-Wunused-value]
  162 |     for (id; id <= q; id += id & (-id))
      |          ^~
foodcourt.cpp: In function 'long long int get(long long int)':
foodcourt.cpp:170:10: warning: statement has no effect [-Wunused-value]
  170 |     for (id; id >= 1; id -= id & (-id))
      |          ^~| # | 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... |