#ifdef LOCAL
#include "/home/bgopc/template/pch.hpp"
#endif
#include <bits/stdc++.h>
using namespace std;
// * No One Dies a Virgin, Life Fucks Us All
typedef long long ll;
#define nl '\n'
#define ff first
#define ss second
#define pb push_back
#define sik(x) {cout << x << nl; return;}
constexpr ll maxn = 3e5+10, mod = 1e9 + 7, inf = 1e17, SQ = 450, LG = 20;
typedef pair<ll, ll> pii;
typedef array<ll, 5> query;
int n, m, q, L[maxn], R[maxn];
pii seg[maxn << 2];
vector<int> who[maxn];
ll fen[maxn];
query Q[maxn];
void addFen(int p, ll x) {
for (; p <= n ; p += p & -p) fen[p] += x;
}
void addFen(int l, int r, ll x) {
addFen(l, x);
addFen(r, -x);
}
ll getFen(int p) {
ll res = 0;
for (; p ; p -= p & -p) res += fen[p];
return res;
}
void tag(int id, int l, int r, ll x, ll y) {
seg[id].ff += x;
seg[id].ss = max(seg[id].ss + x, y);
}
void relax(int id, int l, int r) {
int mid = (l + r) >> 1, lc = id << 1, rc = lc | 1;
tag(lc, l, mid, seg[id].ff, seg[id].ss);
tag(rc, mid, r, seg[id].ff, seg[id].ss);
seg[id].ff = seg[id].ss = 0;
}
void update(int ql, int qr, ll x, int l = 1, int r = n+1, int id = 1) {
if (qr <= l || r <= ql) return;
if (ql <= l && r <= qr) return tag(id, l, r, x, 0);
relax(id, l, r);
int mid = (l + r) >> 1, lc = id << 1, rc = lc | 1;
update(ql, qr, x, l, mid, lc);
update(ql, qr, x, mid, r, rc);
}
ll get(int p, int l = 1, int r = n+1, int id = 1) {
if (r - l == 1) return seg[id].ss;
relax(id, l, r);
int mid = (l + r) >> 1, lc = id << 1, rc = lc | 1;
if (p < mid) return get(p, l, mid, lc);
else return get(p, mid, r, rc);
}
int32_t main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n >> m >> q;
for (int i = 0 ; i < q ; i ++) {
auto& [t, l, r, x, y] = Q[i];
cin >> t;
if (t == 1) {
cin >> l >> r >> x >> y, r ++;
addFen(l, r, y);
update(l, r, y);
} else if (t == 2) {
cin >> l >> r >> x, r ++;
update(l, r, -x);
} else {
cin >> x >> y;
L[i] = -1, R[i] = i;
y += getFen(x) - get(x);
}
}
while (1) {
for (int i = 0 ; i < q ; i ++) who[i].clear();
for (int i = 0 ; i <= n ; i ++) fen[i] = 0;
bool ok = 0;
for (int i = 0 ; i < q ; i ++) {
auto [t, l, r, x, y] = Q[i];
if (t == 3 && R[i] - L[i] > 1) {
int mid = (L[i] + R[i]) >> 1;
who[mid].pb(i);
ok = 1;
}
}
if (ok == 0) break;
for (int i = 0 ; i < q ; i ++) {
{
auto &[t, l, r, x, y] = Q[i];
if (t == 1) addFen(l, r, y);
}
for (int j : who[i]) {
auto &[t, l, r, x, y] = Q[j];
if (getFen(x) >= y) R[j] = i;
else L[j] = i;
}
}
}
for (int i = 0 ; i < q ; i ++) if (Q[i][0] == 3) {
cout << (R[i] == i ? 0 : Q[R[i]][3]) << nl;
}
}