Cod sursa(job #3198707)

Utilizator PescarusTanislav Luca Andrei Pescarus Data 30 ianuarie 2024 10:55:40
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
using namespace std;
const int nmax = 15005;
int arbi[3 * nmax], v[nmax];
void build(int node, int st, int dr){
    if(st == dr){
        arbi[node] = v[st];
        return;
    }
    int mid = (st + dr) / 2;
    build(2 * node, st, mid);
    build(2 * node + 1, mid + 1, dr);
    arbi[node] = arbi[2 * node] + arbi[2 * node + 1];
}

void update(int node, int st, int dr, int x, int y){
    if(st == dr){
        arbi[node] -= y;
        return;
    }
    int mid = (st + dr) / 2;
    if(y <= mid){
        update(2 * node, st, mid, x, y);
    }
    else{
        update(2 * node + 1, mid + 1, dr, x, y);
    }
    arbi[node] = arbi[2 * node] + arbi[2 * node + 1];
}
int query(int node, int st, int dr, int x, int y){
    if(st == x && dr == y){
        return arbi[node];
    }
    int mid = (st + dr) / 2;
    if(y <= mid){
        return query(2 * node, st, mid, x, y);
    }
    else if(x > mid){
        return query(2 * node + 1, mid + 1, dr, x, y);
    }
    else{
        return query(2 * node, st, mid, x, mid) + query(2 * node + 1, mid + 1, dr, mid + 1, y);
    }
}
int main(){
    ifstream f("intrare.in");
    ofstream g("iesire.out");
    int n, m;
    f >> n >> m;
    for(int i = 1; i <= n; i++){
        f >> v[i];
    }
    build(1, 1, n);
    while(m--){
        int t, x, y;
        f >> t >> x >> y;
        if(t == 0){
            update(1, 1, n, x, y);
        }
        else{
            g << query(1, 1, n, x, y) << '\n';
        }
    }
}