#include <bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pii pair<int, int>
#define all(a) a.begin(), a.end()
using namespace std;
#ifdef LOCAL
#include "C:\Users\Dell\Downloads\template\template\icpc-notebook\Utilities\debug.h"
#else
#define debug(...) 42
#endif
const int mn = 5e5 + 5, mod = 1e9 + 7, inf = 2e9;
int n, m, q, del[mn], l_[mn], r_[mn], ans[mn];
vector <int> event[mn];
struct Query {
int t, l, r, c, k, a, b;
} e[mn];
int bit[mn];
void add(int u, int val){
while(u <= n){
bit[u] += val;
u += (u & -u);
}
}
int get(int u){
int r = 0;
while(u){
r += bit[u];
u -= (u & -u);
}
return r;
}
int st_add[mn << 2], st_del[mn << 2], lz[mn << 2];
void appAdd(int id, int val){
st_add[id] += val;
}
void appDel(int id, int val){
st_add[id] = st_add[id] - min(val, st_add[id]);
st_del[id] += val - min(val, st_add[id]);
}
void down(int id, int l, int r){
if(l == r) return;
if(st_del[id]){
appDel(id << 1, st_del[id]);
appDel(id << 1 | 1, st_del[id]);
st_del[id] = 0;
}
if(st_add[id]){
appAdd(id << 1, st_add[id]);
appAdd(id << 1 | 1, st_add[id]);
st_add[id] = 0;
}
}
void update(int id, int l, int r, int u, int v, int val, int t){
if(l > v || r < u) return;
if(l >= u && r <= v){
if(t == 1) appAdd(id, val);
else if(t == -1) appDel(id, val);
return;
}
down(id, l, r);
int mid = (l + r) >> 1;
update(id << 1, l, mid, u, v, val, t);
update(id << 1 | 1, mid + 1, r, u, v, val, t);
}
int get(int id, int l, int r, int u){
if(l > u || r < u) return 0;
if(l == r) return st_add[id];
down(id, l, r);
int mid = (l + r) >> 1;
return get(id << 1, l, mid, u) + get(id << 1 | 1, mid + 1, r, u);
}
void solve() {
cin >> n >> m >> q;
vector <int> candidate;
for(int i = 1; i <= q; i++){
cin >> e[i].t;
if(e[i].t == 1){
cin >> e[i].l >> e[i].r >> e[i].c >> e[i].k;
add(e[i].l, e[i].k);
add(e[i].r + 1, - e[i].k);
update(1, 1, n, e[i].l, e[i].r, e[i].k, 1);
}
else if(e[i].t == 2){
cin >> e[i].l >> e[i].r >> e[i].k;
update(1, 1, n, e[i].l, e[i].r, e[i].k, -1);
}
else{
candidate.push_back(i);
l_[i] = 1, r_[i] = i - 1;
cin >> e[i].a >> e[i].b;
del[i] = get(e[i].a) - get(1, 1, n, e[i].a);
e[i].b += del[i];
debug(i, e[i].a, e[i].b, del[i]);
}
}
while(true){
bool stop = true;
for(auto id : candidate){
if(l_[id] <= r_[id]){
int mid = (l_[id] + r_[id]) >> 1;
event[mid].push_back(id);
stop = false;
}
}
if(stop) break;
fill(bit, bit + n + 1, 0);
int fin = 0;
for(int i = 1; i <= q; i++){
fin = (e[i].t == 1 ? e[i].c : fin);
if(e[i].t == 1){
add(e[i].l, e[i].k);
add(e[i].r + 1, - e[i].k);
}
for(auto id : event[i]){
debug(id, e[id].a, e[id].b, i, get(e[id].a));
if(get(e[id].a) >= e[id].b){
ans[id] = fin, r_[id] = i - 1;
}
else l_[id] = i + 1;
}
event[i].clear();
}
}
for(auto i : candidate) cout << ans[i] << '\n';
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
#define task "Kawabata"
if (fopen(task".INP", "r")) {
freopen(task".INP", "r", stdin);
freopen(task".OUT", "w", stdout);
}
int t = 1;
// cin >> t;
while (t--) solve();
return 0;
}
// Don't wanna lose anymore T_T
// Never let me go - Kazuo Ishiguro