#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define mp make_pair
#define eb emplace_back
#define vi vector<int>
#define pii pair<int,int>
#define F first
#define S second
#define f0r(i,n) for(int i = 0; i < n; i++)
#define FOR(i,k,n) for(int i = k; i < n; i++)
#define dout(x) cout<<x<<' '<<#x<<endl
#define dout2(x,y) cout<<x<<' '<<#x<<' '<<y<<' '<<#y<<endl
#define vout(v) for(auto u : v)cout<<u<<' '; cout<<endl
using namespace std;
const int mxn = 250005;
vector<pii>w[mxn], r[mxn];
int n,m,q;
struct segtree{
int n; vi mn, mx, lzrs, lzadd, tl, tr;
segtree(int x){
n=x; mn.resize(4*n+5);mx.resize(4*n+5);lzrs.resize(4*n+5);lzadd.resize(4*n+5);tl.resize(4*n+5);tr.resize(4*n+5);
build(1,0,n-1);
}
int sz(int v){return tr[v]-tl[v]+1;}
void pull(int v){
mn[v]=min(mn[v*2],mn[v*2+1]); mx[v]=max(mx[v*2],mx[v*2+1]);
}
void reset(int v){
lzrs[v]=1; mn[v]=mx[v]=lzadd[v]=0;
}
void add(int v, int x){
lzadd[v]+=x; mn[v]+=x; mx[v]+=x;
}
void push(int v){
if(lzrs[v]){
reset(v*2); reset(v*2+1); lzrs[v]=0;
}
if(lzadd[v]){
add(v*2,lzadd[v]); add(v*2+1,lzadd[v]); lzadd[v]=0;
}
}
void build(int v, int l, int r){
tl[v]=l, tr[v]=r; if(l==r){return;} int tm = l+r>>1; build(v*2,l,tm); build(v*2+1,tm+1,r);
}
void update(int v, int l, int r, int x){
if(tl[v] > r || tr[v] < l)return; if(tl[v] >= l && tr[v] <= r){
if(mn[v] + x >= 0){add(v,x);return;}
if(mx[v] + x <= 0){reset(v);return;}
}
push(v);update(v*2,l,r,x);update(v*2+1,l,r,x);pull(v);
}
int get(int v, int x){
if(tl[v]==tr[v]){return mn[v];} push(v); if(tr[v*2] >= x)return get(v*2,x); else return get(v*2+1,x);
}
};
struct tseg{
int n; vi sum;
tseg(int x){
n=x; sum.resize(4*n+5);
}
void update(int v, int tl, int tr, int l, int r, int x){
if(tl>=l&&tr<=r){sum[v]+=x;return;} if(tl>r||tr<l)return;
int tm = tl + tr >> 1; update(v*2,tl,tm,l,r,x); update(v*2+1,tm+1,tr,l,r,x);
}
int get(int v, int tl, int tr, int k){
if(tl==tr)return sum[v]; int tm = tl + tr >> 1; if(k <= tm)return sum[v] + get(v*2,tl,tm,k); else return sum[v] + get(v*2+1,tm+1,tr,k);
}
};
struct useg{
int n; vi sum;
useg(int x){
n = x; sum.resize(4*n+5);
}
void pull(int v){sum[v]=sum[v*2]+sum[v*2+1];}
void update(int v, int tl, int tr, int k, int x){
if(tl==tr){sum[v]+=x; return;} int tm = tl + tr >> 1; if(k <= tm)update(v*2,tl,tm,k,x); else update(v*2+1,tm+1,tr,k,x); pull(v);
}
int get_first(int v, int tl, int tr, int x){
if(sum[v] < x)return -1; if(tl==tr)return tl;
int tm = tl + tr >> 1; if(sum[v*2] >= x)return get_first(v*2, tl, tm, x); else return get_first(v*2+1, tm+1, tr, x - sum[v*2]);
}
};
struct query{
int op, l, r, x, y, id;
};
signed main(){
cin>>n>>m>>q; int Q = 0, R = 0; segtree S = segtree(n); tseg T = tseg(n); vi cs; f0r(i,q){
int op; cin>>op; if(op==1){
int l,r,c,k; cin>>l>>r>>c>>k; l--;r--; Q++; cs.pb(c); S.update(1,l,r,k); T.update(1,0,n-1,l,r,k);
w[l].pb(mp(Q-1, k)); w[r+1].pb(mp(Q-1, -k));
}
else if(op == 2){
int l, r, k; cin>>l>>r>>k; l--;r--; S.update(1,l,r,-k);
}
else{
int x, y; cin>>x>>y; x--; int sc = S.get(1,x), tc = T.get(1,0,n-1,x);
if(sc < y)r[x].eb(-1,R); else r[x].eb(tc - sc + y, R); R++;
}
}
vi ans(R); useg U = useg(Q); f0r(i,n){
for(auto [x,y] : w[i])U.update(1,0,Q-1,x,y); for(auto [x, id] : r[i]){
if(x==-1)continue; int d = U.get_first(1, 0, Q-1, x); ans[id] = cs[d];
}
} for(auto u : ans)cout<<u<<'\n';
}