#include<bits/stdc++.h>
using namespace std;
const int MAXN=252525;
int getlog(long long n) { return 63-__builtin_clzll(n); }
struct fenwicktree
{
long long fen[MAXN];
void update(int i,int n,long long val) { for(;i<=n;i+=i&-i) fen[i]+=val; }
long long get(int i) { long long ans=0;for(;i;i-=i&-i) ans+=fen[i];return ans; }
int walk(int n,long long val) { int ans=0;for(int i=getlog(n);i+1;i--) if(ans+(1<<i)<=n&&val>fen[ans+(1<<i)]) val-=fen[ans+=(1<<i)];return ans+1; }
};
struct node
{
long long pref,mn,pos;
};
struct query
{
long long t,idx,val;
};
node merge(node a,node b)
{
node c;
c.pref=a.pref+b.pref;
if(a.mn<a.pref+b.mn) c.mn=a.mn,c.pos=a.pos;
else c.mn=a.pref+b.mn,c.pos=b.pos;
return c;
}
node seg[MAXN*4];
fenwicktree fa,fb;
int A[MAXN];
bool ck[MAXN];
long long ans[MAXN];
vector<query> vq[MAXN];
void build(int l,int r,int pos)
{
if(l==r)
{
seg[pos]={0,0,l};
return ;
}
int mid=(l+r)/2;
build(l,mid,pos*2);
build(mid+1,r,pos*2+1);
seg[pos]=merge(seg[pos*2],seg[pos*2+1]);
}
void update(int l,int r,int i,long long val,int pos)
{
if(i<l||r<i) return ;
if(l==r)
{
seg[pos].pref+=val,seg[pos].mn+=val;
return ;
}
int mid=(l+r)/2;
update(l,mid,i,val,pos*2);
update(mid+1,r,i,val,pos*2+1);
seg[pos]=merge(seg[pos*2],seg[pos*2+1]);
}
node get(int l,int r,int u,int v,int pos)
{
if(u<=l&&r<=v) return seg[pos];
int mid=(l+r)/2;
if(v<=mid) return get(l,mid,u,v,pos*2);
if(mid+1<=u) return get(mid+1,r,u,v,pos*2+1);
return merge(get(l,mid,u,v,pos*2),get(mid+1,r,u,v,pos*2+1));
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m,q;
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;
vq[l].push_back({1,i,k});
vq[r+1].push_back({1,i,-k});
A[i]=c;
}
else if(t==2)
{
int l,r,k;
cin>>l>>r>>k;
vq[l].push_back({2,i,-k});
vq[r+1].push_back({2,i,k});
}
else
{
long long p,k;
cin>>p>>k;
vq[p].push_back({3,i,k});
ck[i]=true;
}
}
build(0,q,1);
for(int i=1;i<=n;i++)
{
for(auto v:vq[i]) if(v.t==1)
{
update(0,q,v.idx,v.val,1);
fa.update(v.idx,q,v.val);
}
else if(v.t==2)
{
update(0,q,v.idx,v.val,1);
fb.update(v.idx,q,v.val);
}
else
{
int pos=get(0,q,0,v.idx,1).pos;
int p=fa.walk(q,v.val-fb.get(v.idx)+fb.get(pos)+fa.get(pos));
if(p<=v.idx) ans[v.idx]=A[p];
else ans[v.idx]=0;
}
}
for(int i=1;i<=q;i++) if(ck[i]) cout<<ans[i]<<"\n";
}