Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define int long long
- const int MAXN = 2e5 + 10;
- int seg[4*MAXN], lz[4*MAXN];
- void refresh(int pos, int ini, int fim)
- {
- if (lz[pos] == 0) return;
- seg[pos] += (fim - ini + 1) * lz[pos];
- if (ini != fim)
- {
- int e = 2*pos; int d = 2*pos + 1;
- lz[e] += lz[pos];
- lz[d] += lz[pos];
- }
- lz[pos] = 0;
- }
- void update(int pos, int ini, int fim, int p, int q, int val)
- {
- refresh(pos, ini, fim);
- if (q < ini || p > fim) return;
- if (p <= ini && fim <= q)
- {
- lz[pos] += val;
- refresh(pos, ini, fim);
- return;
- }
- int m = (ini + fim) >> 1;
- int e = 2*pos; int d = 2*pos + 1;
- update(e, ini, m , p, q, val);
- update(d, m+1, fim, p, q, val);
- seg[pos] = seg[e] + seg[d];
- }
- int query(int pos, int ini, int fim, int p, int q)
- {
- refresh(pos, ini, fim);
- if (q < ini || p > fim) return 0;
- if (p <= ini && fim <= q) return seg[pos];
- int m = (ini + fim) >> 1;
- int e = 2*pos; int d = 2*pos + 1;
- return (query(e, ini, m, p, q) + query(d, m+1, fim, p, q));
- }
- int32_t main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- int N, M;
- cin >> N >> M;
- while (M--)
- {
- int type;
- cin >> type;
- if (type == 1)
- {
- int id, V;
- cin >> id >> V;
- update(1, 1, N, id, id, V);
- update(1, 1, N, id+1, min(id+V, N), -1);
- }
- else if (type == 2)
- {
- int id, V;
- cin >> id >> V;
- update(1, 1, N, id+1, id+1, -V);
- if (id - V < 0)
- {
- update(1, 1, N, 1, 1, V - (id - 1));
- update(1, 1, N, 2, id, +1);
- }
- else update(1, 1, N, id-V+1, id, +1);
- }
- else
- {
- int id;
- cin >> id;
- cout << query(1, 1, N, 1, id) << '\n';
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement