rt
#include<bits/stdc++.h>
#define R read()
#define P printf
#define int long long
using namespace std;
int read(){
int x = 0, f = 1;char ch = getchar();
while(ch < '0' || ch > '9')
if(ch == '-') f = ch = -1;
else ch = getchar();
while(ch >= '0' && ch <= '9')
x = (x << 3) + (x << 1) + ch - '0',
ch = getchar();
return x * f;
}
const int N = 3e5 + 15;
int sum[N], pig, q, top1, top2, a[N];
struct treee{
int t[N << 2], add[N << 2];
treee(){
memset(t, 0, sizeof t);
memset(add, -1, sizeof add);
}
#define ls (k << 1)
#define rs (k << 1 | 1)
#define mid (l + r >> 1)
void Add(int k, int v){
t[k] = v;
add[k] = v;
}
void pushd(int k){
if(add[k] != -1){
Add(ls, add[k]);
Add(rs, add[k]);
add[k] = -1;
}
}
void moy(int k, int l, int r, int x, int y, int val){
if(y < l || r < x) return;
// P("(L, R) = %lld %lld\n", l, r);
if(x <= l && r <= y) return Add(k, val), void();
pushd(k);
moy(ls, l, mid, x, y, val);
moy(rs, mid + 1, r, x, y, val);
t[k] = max(t[ls], t[rs]);
}
int query(int k, int l, int r, int x, int y){
if(y < l || r < x) return -3e9;
if(x <= l && r <= y) return t[k];
pushd(k);
int res = -3e9;
res = max(res, query(ls, l, mid, x, y));
res = max(res, query(rs, mid + 1, r, x, y));
return res;
}
}tree;
signed main(){
// freopen("queue6.in", "r", stdin);
// freopen("queue.out", "w", stdout);
pig = R;q = R;
pig = 0;top1 = 1;
for(int i = 1;i <= q;++ i){
int lzh = R;
if(lzh == 1){
int x = R;
sum[++ top2] = sum[top2 - 1] + x;
tree.moy(1, 1, N - 5, top2, top2, x);
}else if(lzh == 2){
int x = R;
int l = top1, r = top2, res = l - 1;
while(l <= r){
if(sum[mid] - pig <= x) res = mid, l = mid + 1;
else r = mid - 1;
}
if(res >= top1) tree.moy(1, 1, N - 5, top1, res, - 3e9);
top1 = res + 1;
pig += x;
}else if(lzh == 3){
int x = R;
int l = top1, r = top2, res = l - 1;
while(l <= r){
if(sum[mid] - pig < x) res = mid, l = mid + 1;
else r = mid - 1;
}
P("%lld\n", x - sum[res] + pig);
}else{
P("%lld\n", tree.query(1, 1, N - 5, top1, top2));
}
// P("l = %lld, r = %lld\n", top1, top2);
}
return 0;
}