Cod sursa(job #1821659)

Utilizator mirunazMiruna Zavelca mirunaz Data 3 decembrie 2016 14:07:37
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
using namespace std;

int n, m, type, a, b, ans, v[60000];

int sum (int x, int y)
{
    return x + y;
}

void build ()
{
    for (int i=n-1; i>0; i--){
        v[i] = sum (v[2*i], v[2*i+1]);
    }
}

void update (int x, int y)
{
    int node = x+n-1;
    v[node] -= y;
    node /= 2;
    while (node>0){
        v[node] = sum (v[2*node], v[2*node+1]);
        node /= 2;
    }
}

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

void show ()
{
    for (int i=1; i<=2*n; i++){
        printf ("%d ", v[i]);
    }
    printf("\n");
}

int main ()
{
    freopen ("datorii.in", "r", stdin);
    freopen ("datorii.out", "w", stdout);
    scanf ("%d %d", &n, &m);
    type = 1;
    while (type<n){
        type *= 2;
    }
    for (int i=type; i<type+n; i++){
        scanf ("%d", &v[i]);
    }
    n = type;
    build ();
    for (int i=1; i<=m; i++){
        scanf ("%d %d %d", &type, &a, &b);
        if (type == 0){
            update (a, b);
        }
        else{
            ans = 0;
            query (1, 1, n);
            printf ("%d\n", ans);
        }
    }
    return 0;
}