Cod sursa(job #2891053)

Utilizator hobbitczxdumnezEU hobbitczx Data 17 aprilie 2022 13:34:40
Problema Datorii Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N_MAX = 15e3 + 5;

int arb[4 * N_MAX] , n , m , a[N_MAX];

inline int left_son (int node){
    return 2 * node;
}

inline int right_son (int node){
    return 2 * node + 1;
}

void build(int st , int dr , int node){
    if (st == dr){
        arb[node] = a[st];
        return;
    }
    int mij = (st + dr) / 2;
    build(st , mij , left_son(node));
    build(mij + 1 , dr , right_son(node));
    arb[node] = arb[left_son(node)] + arb[right_son(node)];
}

void update (int st ,int dr , int poz , int val , int node){
    if (st > poz || dr < poz){
        return;
    }
    if (st == dr){
        arb[node] -= val;
        return;
    }
    int mij = (st + dr) / 2;
    update(st , mij , poz , val , left_son(node));
    update(mij + 1 , dr , poz , val , right_son(node));
    arb[node] = arb[left_son(node)] + arb[right_son(node)];
}

int query (int st , int dr , int Qst , int Qdr , int node){
    if (st > Qdr || dr < Qst){
        return 0;
    }
    if (Qst <= st && dr <= Qdr){
        return arb[node];
    }
    int mij = (st + dr) / 2;
    return query(st , mij , Qst , Qdr , left_son(node)) + query(mij + 1 , dr , Qst , Qdr , right_son(node));
}

int main(){
    ios_base::sync_with_stdio(false);
    fin.tie(NULL);
    fin >> n >> m;
    for (int i=1; i<=n; i++){
        fin >> a[i];
    }
    build(1 , n , 1);
    while (m--){
        int op , l , r; fin >> op >> l >> r;
        if (op == 0){
            update(1 , n , l , r , 1);
        }
        else{
            fout << query(1 , n , l , r , 1) << '\n';
        }
    }
}