#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int c,q,l=1,r,sum[N];
struct Q{
int s;
int e;
}a[N];
struct T{
int l;
int r;
int maxn;
}t[N*4];
void pushup(int i){
t[i].maxn=max(t[i*2].maxn,t[i*2+1].maxn);
}
void build(int i,int l,int r){
t[i].l=l;
t[i].r=r;
if(l==r){
t[i].maxn=0;
return;
}
int mid=(l+r)/2;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
pushup(i);
}
void update(int x,int i,int y){
if(t[i].l==y&&t[i].r==y){
t[i].maxn=x;
return;
}
int mid=(t[i].l+t[i].r)/2;
if(y<=mid){
update(x,i*2,y);
}
else{
update(x,i*2+1,y);
}
pushup(i);
}
int query(int i,int l,int r){
if(t[i].l>=l&&t[i].r<=r){
return t[i].maxn;
}
int ans=0;
if(t[i*2].r>=l){
ans=max(ans,query(i*2,l,r));
}
if(t[i*2+1].l<=r){
ans=max(ans,query(i*2+1,l,r));
}
return ans;
}
int main(){
cin>>c>>q;
build(1,1,q);
for(int i=1;i<=q;i++){
int op;
cin>>op;
if(op==1){
int x;
cin>>x;
r++;
a[r].s=1;
a[r].e=x;
sum[r]=sum[r-1]+x;
update(x,l,r);
}
if(op==2){
int y,m=a[l].e-a[l].s+1;
cin>>y;
if(y<=m){
a[l].s=a[l].s+y;
continue;
}
int x=lower_bound(sum+l+1,sum+r+1,y+sum[l]-m)-sum;
int dc=sum[x]-sum[l];
int tmp=dc+m-y;
a[x].s=a[x].e-tmp+1;
l=x;
}
if(op==3){
int z,m=a[l].e-a[l].s+1;
cin>>z;
if(z<=m){
cout<<a[l].s+z-1<<endl;
continue;
}
int x=lower_bound(sum+l+1,sum+r+1,z+sum[l]-m)-sum;
int dc=sum[x]-sum[l];
int tmp=dc+m-z;
cout<<a[x].e-tmp<<endl;
}
if(op==4){
cout<<query(1,l,r)<<endl;
}
}
return 0;
}