Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- //Дерево отрезков с обновлением на отрезке
- const int MAXN = (int)1e5 + 7;
- ll t[4 * MAXN], add[4 * MAXN];
- void update(int v, int lt, int rt, int L, int R, ll val) {
- if (R < lt || L > rt) return;
- if (L <= lt && rt <= R) {
- t[v] += val * (rt - lt + 1);
- add[v] += val;
- } else {
- int l = v * 2, r = l + 1;
- int mt = (lt + rt) / 2;
- update(l, lt, mt, L, R, val);
- update(r, mt + 1, rt, L, R, val);
- t[v] = t[l] + t[r] + add[v] * (rt - lt + 1);
- }
- }
- ll ask(int v, int lt, int rt, int L, int R, ll ad = 0) {
- if (R < lt || L > rt) return 0;
- if (L <= lt && rt <= R) return t[v] + ad * (rt - lt + 1);
- int l = v * 2, r = l + 1;
- int mt = (lt + rt) / 2;
- ll val = ask(l, lt, mt, L, R, ad + add[v]) + ask(r, mt + 1, rt, L, R, ad + add[v]);
- return val;
- }
- int main() {
- int n, m;
- cin >> n >> m;
- for (int i = 1; i <= m; i++) {
- ll x;
- cin >> x;
- update(1, 1, m, i, i, x); //обновление в точке i, ну и это типа build
- }
- //update(1, 1, m, l, r, v); - обновление на отрезке [l, r]
- //s = ask(1, 1, m, i, j); - запрос на отрезке [i, j]
- // нумерация, видимо, с единицы
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement