Cod sursa(job #2978448)

Utilizator epicrobloxgamerTiberiu Tiron epicrobloxgamer Data 13 februarie 2023 19:25:33
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <bits/stdc++.h>
#define nl '\n'
#define ll int
using namespace std;
const int N = 2e5 + 2;
int n, q, tree[N], val[N];
ifstream in("datorii.in");
ofstream out("datorii.out");
void build(ll v, ll l, ll r) {
    if (l == r)
        tree[v] = val[l];
    else {
        ll M = (l + r) / 2;
        build(2 * v, l, M);
        build(2 * v + 1, M + 1, r);
        
        tree[v] = tree[2 * v] + tree[2 * v + 1];
    }
}
void update(ll v, ll l, ll r, ll poz, ll vals) {
    if (l == r)
        tree[v] -= vals;
    else {
        ll M = (l + r) / 2;
        if (M >= poz)
            update(2 * v, l, M, poz, vals);
        else update(2 * v + 1, M + 1, r, poz, vals);
        tree[v] = tree[v * 2 + 1] + tree[v * 2];
    }
}
ll answer(ll v, ll l, ll r, ll ql, ll qr) {
    if (ql > qr)
        return 0;
    if (ql >= l and r <= qr)
        return tree[v];
    else {
        ll M = (l + r) / 2;
        return answer(2 * v + 1, M + 1, r, max(ql, M + 1), qr) + answer(2 * v, l, M, ql, min(qr, M));
    }
}

int main() {
    in >> n >> q;
    for (int i = 1; i <= n; i++)
        in >> val[i];
    build(1, 1, n);
    for (int i = 1; i <= q; i++) {
        ll cer, x, y;
        in >> cer >> x >> y;
        if (cer == 1)
            out << answer(1, 1, n, x, y) << nl;
        if (cer == 0)
            update(1, 1, n, x, y);
    }
    return 0;
}