Cod sursa(job #2816839)

Utilizator PetstebPopa Petru Petsteb Data 12 decembrie 2021 12:06:03
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>

using namespace std;

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

int n, aint[60001];

void build_aint(int poz, int l, int r){
    if(l == r){
        in >> aint[poz];
        return;
    }
    int mid = (l + r) / 2;
    build_aint(poz * 2, l, mid);
    build_aint(poz * 2 + 1, mid + 1, r);
    aint[poz] = aint[poz * 2] +aint[poz * 2 + 1];
}

void pay(int poz, int l, int r, int d, int v){
    if(l == r){
        aint[poz] -= v;
        return;
    }
    int mid = (l + r) / 2;
    if(d <= mid)
        pay(poz * 2, l, mid, d, v);
    else
        pay(poz * 2 + 1, mid + 1, r, d, v);
    aint[poz] = aint[poz * 2] + aint[poz * 2 + 1];
}

int query(int poz, int l, int r, int x, int y){
    if(l > y || r < x)
        return 0;
    if(l >= x && r <= y)
        return aint[poz];
    int mid = (l + r) / 2;
    int sum_l = query(poz * 2, l, mid, x, y);
    int sum_r = query(poz * 2 + 1, mid + 1, r, x, y);
    return sum_l + sum_r;
}

int main()
{
    int m;
    in >> n >> m;
    build_aint(1, 1, n);
    bool type;
    int t, v, p, q;
    while(m--){
        in >> type;
        if(type){
            in >> p >> q;
            out << query(1, 1, n, p, q) << '\n';
        }
        else{
            in >> t >> v;
            pay(1, 1, n, t, v);
        }
    }
    return 0;
}