#include using namespace std; typedef long long ll; #define int ll #define ls rt << 1 #define rs rt << 1 | 1 const int inf = 1e18; const int N = 5e5 + 7; int n, q, tot = 0; struct QWQ { int l, r; } T[N]; struct node { int val, col, lazy; } tr[N * 2]; inline void pushup(int rt) { tr[rt].val = tr[ls].val + tr[rs].val; tr[rt].col = tr[ls].col + tr[rs].col; return; } inline void pushdown(int rt, int l, int r) { int mid = (l + r) / 2; if (tr[rt].lazy) { tr[ls].lazy = tr[rt].lazy; tr[rs].lazy = tr[rt].lazy; tr[ls].col = tr[rt].lazy * (mid - l + 1); tr[rs].col = tr[rt].lazy * (r - mid); tr[rt].lazy = 0; } } inline void Update(int X, int C, int l, int r, int rt) { if (l == r) { tr[rt].val += C; return; } int mid = (l + r) / 2; pushdown(rt, l, r); if (X <= mid) Update(X, C, l, mid, ls); else Update(X, C, mid + 1, r, rs); pushup(rt); return; } inline void update(int L, int R, int col, int l, int r, int rt) { if (L <= l && r <= R) { tr[rt].lazy = col; tr[rt].col = (r - l + 1) * col; return; } int mid = (l + r) / 2; pushdown(rt, l, r); if (L <= mid) update(L, R, col, l, mid, ls); if (R > mid) update(L, R, col, mid + 1, r, rs); pushup(rt); } inline int Query(int L, int R, int l, int r, int rt) { if (L <= l && r <= R) return tr[rt].val; int mid = (l + r) / 2, res = 0; pushdown(rt, l, r); if (L <= mid) res += Query(L, R, l, mid, ls); if (R > mid) res += Query(L, R, mid + 1, r, rs); return res; } inline int query(int X, int l, int r, int rt) { if (l == r) return tr[rt].col; int mid = (l + r) / 2; pushdown(rt, l, r); if (X <= mid) return query(X, l, mid, ls); return query(X, mid + 1, r, rs); } signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> q; for (int i = 1; i <= n; i++) { int x; cin >> x; Update(i, x, 1, n, 1); update(i, i, i, 1, n, 1); T[++tot] = {i, i}; } while (q--) { int op, x; cin >> op >> x; if (op == 3) Update(x, 1, 1, n, 1); else if (op == 4) { int tmp = query(x, 1, n, 1); int L = T[tmp].l; int R = T[tmp].r; cout << Query(L, R, 1, n, 1) << "\n"; } else if (op == 2) { int id1 = query(x, 1, n, 1); int id2 = query(x + 1, 1, n, 1); if (id1 != id2) continue; int L = T[id1].l; int R = T[id1].r; T[id1].l = x + 1; ++tot; update(L, x, tot, 1, n, 1); T[tot] = {L, x}; } else { int id1 = query(x, 1, n, 1); int id2 = query(x + 1, 1, n, 1); if (id1 == id2) continue; T[id1].r = T[id2].r; T[id2] = {0, 0}; update(T[id1].l, T[id1].r, id1, 1, n, 1); } } }