Cod sursa(job #1826824)

Utilizator horatiucheval2Horatiu Andrei Cheval horatiucheval2 Data 10 decembrie 2016 22:23:58
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 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 val){
    if(left == right){
        tree[node] = val;
    }else{
        int mid = (left + right) / 2;
        if(pos <= mid){
            update(tree, 2 * node, left, mid, pos, val);
        }else{
            update(tree, 2 * node + 1, mid + 1, right, pos, val);
        }
        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], v[MAX];
    fin >> n >> m;

    for(int i = 1; i <= n; i++){
        fin >> v[i];
        update(tree, 1, 1, n, i, v[i]);
    }

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

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