Cod sursa(job #3032688)

Utilizator Cosmin1605Damian Cosmin Cosmin1605 Data 22 martie 2023 16:41:19
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <iostream>
#include <fstream>
#define NMAX 15005
using namespace std;

ifstream in("datorii.in");
ofstream out("datorii.out");
int n, m, v[NMAX], tree[4*NMAX], op, zi, val, x, y;

void build(int node, int left, int right){
    if(left == right){
        tree[node] = v[left];
    }
    else{
        int mid = (left + right) / 2;
        int left_son = 2 * node;
        int right_son = 2 * node + 1;

        build(left_son, left, mid);
        build(right_son, mid+1, right);

        tree[node] = tree[left_son] + tree[right_son];
    }
}

void update(int node, int left, int right, int position, int value){
    if(left == right){
        tree[node] -= value;
    }
    else{
        int mid = (left + right) / 2;
        int left_son = 2 * node;
        int right_son = 2 * node + 1;

        if(position <= mid){
            update(left_son,left,mid,position,value);
        }
        else{
            update(right_son,mid+1,right,position,value);
        }

        tree[node] = tree[left_son] + tree[right_son];
    }
}

int query(int node, int left, int right, int x, int y){
    if(x <= left && right <= y){
        return tree[node];
    }
    else{
        int mid = (left + right) / 2;
        int left_son = 2 * node;
        int right_son = 2 * node + 1;
        int sum_left = 0, sum_right = 0;

        if(x <= mid){
            sum_left = query(left_son,left,mid,x,y);
        }
        if(mid+1 <= y){
            sum_right = query(right_son,mid+1,right,x,y);
        }

        return (sum_left + sum_right);
    }
}

int main()
{
    in >> n >> m;
    for(int i = 1; i <= n; i++){
        in >> v[i];
    }

    build(1,1,n);

    for(int i = 1; i <= m; i++){
        in >> op;
        if(op == 0){
            in >> zi >> val;
            update(1,1,n,zi,val);
        }
        if(op == 1){
            in >> x >> y;
            out << query(1,1,n,x,y) << '\n';
        }
    }
    return 0;
}