#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define fi first
#define se second
#define task "text"
#define int long long
const int N = 255551;
int n,m,q;
struct segtree{
int st[4*N],lz[4*N];
void update(int id,int l,int r,int p,int val){
if(l==r){
st[id]=val;
return;
}
int mid=(l+r)>>1;
if(mid<p) update(id<<1|1,mid+1,r,p,val);
else update(id<<1,l,mid,p,val);
st[id]=(st[id<<1]+st[id<<1|1]);
}
void down(int id){
if(lz[id]==0) return;
int t=lz[id];
lz[id<<1]+=t;
lz[id<<1|1]+=t;
st[id<<1]+=t;
st[id<<1|1]+=t;
lz[id]=0;
return;
}
void updrange(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]+=val;
lz[id]+=val;
return;
}
int mid=(l+r)>>1;
down(id);
updrange(id<<1,l,mid,u,v,val);
updrange(id<<1|1,mid+1,r,u,v,val);
st[id]=min(st[id<<1],st[id<<1|1]);
}
int getmin(int id,int l,int r,int u,int v){
if(r<u || v<l) return 2e18;
if(u<=l && r<=v) return st[id];
int mid=(l+r)>>1;
down(id);
return min(getmin(id<<1,l,mid,u,v),getmin(id<<1|1,mid+1,r,u,v));
}
int getsum(int id,int l,int r,int u,int v){
if(r<u || v<l) return 0;
if(u<=l && r<=v) return st[id];
int mid=(l+r)>>1;
return getsum(id<<1,l,mid,u,v)+getsum(id<<1|1,mid+1,r,u,v);
}
int findkth(int id,int l,int r,int k){
if(l==r){
return l;
}
int mid=(l+r)>>1;
if(st[id<<1]>=k) return findkth(id<<1,l,mid,k);
else return findkth(id<<1|1,mid+1,r,k-st[id<<1]);
}
}stsum,stmin,stk;
struct que{
int t,l,r,c,k;
}query[N];
vector<pair<int,int>> eve[N];
int ans[N];
signed main(){
ios::sync_with_stdio(false);cin.tie(nullptr);
if(fopen(task".inp","r")){
freopen(task".inp","r",stdin);
}
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;
query[i]={t,l,r,c,k};
eve[l].push_back({i,1});
eve[r+1].push_back({i,-1});
}else if(t == 2){
int l,r,k;
cin>>l>>r>>k;
query[i]={t,l,r,0,k};
eve[l].push_back({i,1});
eve[r+1].push_back({i,-1});
}else{
int a,b;
cin>>a>>b;
query[i]={t,a,0,0,b};
eve[a].push_back({i,1});
}
}
for(int i=1;i<=n;i++){
for(auto &[id,type]:eve[i]){
if(query[id].t == 1){
if(type == 1){
stsum.update(1,1,q,id,query[id].k);
stk.update(1,1,q,id,query[id].k);
stmin.updrange(1,1,q,id,q,query[id].k);
}else{
stsum.update(1,1,q,id,0);
stk.update(1,1,q,id,0);
stmin.updrange(1,1,q,id,q,-query[id].k);
}
}else if(query[id].t == 2){
if(type == 1){
stsum.update(1,1,q,id,-query[id].k);
stmin.updrange(1,1,q,id,q,-query[id].k);
}else{
stsum.update(1,1,q,id,0);
stmin.updrange(1,1,q,id,q,query[id].k);
}
}
}
for(auto &[id,tmp]:eve[i]){
if(query[id].t == 3){
int p=id;
int kth=query[id].k;
int sum=stsum.getsum(1,1,q,1,p);
int mnsum=min(0LL,stmin.getmin(1,1,q,1,p));
int rsum=sum-mnsum;
if(kth <= rsum){
int tru=rsum-kth;
int rk=stk.getsum(1,1,q,1,p)-tru;
int findp=stk.findkth(1,1,q,rk);
ans[id]=query[findp].c;
}else{
ans[id]=0;
}
}
}
}
for(int i=1;i<=q;i++){
if(query[i].t == 3){
cout<<ans[i]<<'\n';
}
}
}