Cod sursa(job #3362920)

Utilizator CorvinJudge0Corvin Judge CorvinJudge0 Data 13 august 2026 09:55:48
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <stdio.h>

#define MAXN 131072

int v[MAXN + 1], arb[2 * MAXN];

int query(int n, int p2, int nod, int a, int b) {
    int st, dr, mij, rez;

    st = (nod - p2) * (n / p2) + 1;
    dr = st + n / p2 - 1;
    mij = (st + dr) / 2;

    if (a == st && b == dr)
        return arb[nod];

    if (a <= mij && b <= mij) {
        rez = query(n, 2 * p2, 2 * nod, a, b);
    } else if (a > mij && b > mij) {
        rez = query(n, 2 * p2, 2 * nod + 1, a, b);
    } else {
        rez = query(n, 2 * p2, 2 * nod, a, mij) + query(n, 2 * p2, 2 * nod + 1, mij + 1, b);
    }

    return rez;
}

void update(int n, int idx, int val) {
    int poz;

    poz = n + idx - 1;
    arb[poz] -= val;
    n /= 2;
    while (n) {
        poz = (poz - (poz & 1)) / 2;
        arb[poz] = arb[2 * poz] + arb[2 * poz + 1];
        n /= 2;
    }
}

int main() {
    FILE *fin, *fout;
    int n, m, p2, op, a, b, i;

    fin = fopen("datorii.in", "r");
    fscanf(fin, "%d%d", &n, &m);
    for (i = 1; i <= n; i++) {
        fscanf(fin, "%d", &v[i]);
    }

    p2 = 1;
    while (p2 < n) {
        p2 *= 2;
    }
    n = p2;

    for (i = n; i < 2 * n; i++) {
        arb[i] = v[i - n + 1];
    }
    p2 /= 2;
    while (p2) {
        for (i = p2; i < 2 * p2; i++) {
            arb[i] = arb[2 * i] + arb[2 * i + 1];
        }
        p2 /= 2;
    }

    fout = fopen("datorii.out", "w");
    for (i = 1; i <= m; i++) {
        fscanf(fin, "%d%d%d", &op, &a, &b);

        if (op == 0) {
            update(n, a, b);
        } else {
            fprintf(fout, "%d\n", query(n, 1, 1, a, b));
        }
    }
    fclose(fin);
    fclose(fout);

    return 0;
}