Cod sursa(job #2601993)

Utilizator RG1999one shot RG1999 Data 15 aprilie 2020 16:52:19
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <bits/stdc++.h>
#define MAXL 100000
using namespace std;

void update(int *T, int nod, int left, int right, int value, int pos) {
    if(left == right) {
        T[nod] -= value;
        return;
    }
    int mid = (left + right) / 2;
    if(pos <= mid) {
        update(T, 2 * nod, left, mid, value, pos);
    } else {
        update(T, 2 * nod + 1, mid + 1, right, value, pos);
    }
    T[nod] = T[2 * nod] + T[2 * nod + 1];
}

void query(int *T, int nod, int left, int right, int *a, int *b, int *sum) {
    if(left >= *a && right <= *b) {
        *sum += T[nod];
        return;
    }
    int mid = (left + right) / 2;
    if(*a <= mid) {
        query(T, 2 * nod, left, mid, a, b, sum);
    }
    if(*b > mid) {
        query(T, 2 * nod + 1, mid + 1, right, a, b, sum);
    }

}

int main()
{
    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);
    int n, m, T[MAXL], x;
    scanf("%d %d", &n, &m);
    for(int i = 0; i < n; i++) {
        scanf("%d", &x);
        update(T, 1, 1, n, -x, i + 1);
    }
    int cod, a, b, sum;
    for(int i = 0; i < m; i++) {
        scanf("%d %d %d", &cod, &a, &b);
        if(cod == 0) {
            update(T, 1, 1, n, b, a);
        } else {
            sum = 0;
            query(T, 1, 1, n, &a, &b, &sum);
            printf("%d\n", sum);
        }

    }

    return 0;
}