Rt
Code:
#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
typedef long long LL;
int c, m;
int hh = 1, tt = 0;
struct Node
{
int l, r;
LL sum; int maxv;
}tr[N * 4];
void build(int u, int l, int r)
{
if (l == r) tr[u] = {l, r, 0, 0};
else
{
tr[u] = {l, r};
int mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
}
}
void modify(int u, int x, LL v, int y)
{
if (tr[u].l == tr[u].r) tr[u].sum += v, tr[u].maxv += y;
else
{
int mid = tr[u].l + tr[u].r >> 1;
if (x <= mid) modify(u << 1, x, v, y);
else modify(u << 1 | 1, x, v, y);
tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
tr[u].maxv = max(tr[u << 1].maxv, tr[u << 1 | 1].maxv);
}
}
int query_max(int u, int l, int r)
{
if (l > r) return 0;
if (tr[u].l >= l && tr[u].r <= r) return tr[u].maxv;
int mid = tr[u].l + tr[u].r >> 1;
int res = 0;
if (l <= mid) res = max(res, query_max(u << 1, l, r));
if (r > mid) res = max(res, query_max(u << 1 | 1, l, r));
return res;
}
LL query_sum(int u, int l, int r)
{
if (l > r) return 0;
if (tr[u].l >= l && tr[u].r <= r) return tr[u].sum;
int mid = tr[u].l + tr[u].r >> 1;
LL res = 0;
if (l <= mid) res += query_sum(u << 1, l, r);
if (r > mid) res += query_sum(u << 1 | 1, l, r);
return res;
}
int main()
{
// freopen("queue.in", "r", stdin);
// freopen("queue.out", "w", stdout);
scanf("%d%d", &c, &m); build(1, 1, N - 1);
for (int i = 1; i <= m; i ++ )
{
int op, x;
scanf("%d", &op);
if (op == 4) printf("%d\n", query_max(1, hh, tt));
else
{
scanf("%d", &x);
if (op == 1)
{
tt ++ ;
modify(1, tt, x, x);
}
else if (op == 2)
{
int l = hh - 1, r = tt;
while (l < r)
{
int mid = l + r >> 1;
if (query_sum(1, hh, mid) <= x) l = mid + 1;
else r = mid;
}
x -= query_sum(1, hh, l - 1);
hh = l;
modify(1, hh, -x, 0);
}
else
{
int l = hh - 1, r = tt;
while (l < r)
{
int mid = l + r + 1 >> 1;
if (query_sum(1, hh, mid) < x) l = mid;
else r = mid - 1;
}
x -= query_sum(1, hh, l);
printf("%lld\n", query_max(1, l + 1, l + 1) - query_sum(1, l + 1, l + 1) + x);
}
}
// puts("The queue:");
// for (int i = hh; i <= tt; i ++ )
// {
// printf("%d %d\n", query_max(1, i, i), query_sum(1, i, i));
// }
// puts("\n\n\n");
}
return 0;
}