Cod sursa(job #1826813)

Utilizator horatiucheval2Horatiu Andrei Cheval horatiucheval2 Data 10 decembrie 2016 22:01:13
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <iostream>
#include <fstream>
using namespace std;

const int MAX = 15000;

void update(int tree[], int node, int left, int right, int pos, int diff){
    if(left == right){
        tree[node] -= diff;
    }else{
        int mid = (left + right) / 2;
        if(pos <= mid){
            update(tree, 2 * node, left, mid, pos, diff);
        }else{
            update(tree, 2 * node + 1, mid + 1, right, pos, diff);
        }
        tree[node] = tree[2 * node] + tree[2 * node + 1];
    }
}

int query(int tree[], int node, int left, int right, int a, int b){
    if(a <= left && right <= b){
        return tree[node];
    }else{
        int mid = (left + right) / 2;
        int sumLeft = 0, sumRight = 0;
        if(a <= mid){
            sumLeft = query(tree, 2 * node, left, mid, a, b);
        }
        if(mid < b){
            sumRight = query(tree, 2 * node + 1, mid + 1, right, a, b);
        }
        return sumLeft + sumRight;
    }
}

int main(){
    ifstream fin("datorii.in");
    ofstream fout("datorii.out");

    int n, m;
    int tree[8 * MAX];
    fin >> n >> m;

    for(int i = 1; i <= n; i++){
        int x;
        fin >> x;
        update(tree, 1, 1, n, i, -x);
    }

    for(int i = 1; i <= m; i++){
        int op, a, b;
        fin >> op >> a >> b;
        if(op == 0){
            update(tree, 1, 1, n, a, b);
        }else if(op == 1){
            fout << query(tree, 1, 1, n, a, b) << "\n";
        }
    }

    fin.close();
    fout.close();
    return 0;
}