Cod sursa(job #2904731)

Utilizator memitaBeniamin Vasile memita Data 18 mai 2022 00:56:59
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <bits/stdc++.h>

using namespace std;

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

int arb[600008];

void build (int nod, int s, int d, int poz, int val)
{
    if (s == d){
        arb[nod] = val;
    }
    else{
        int mij = (s + d) / 2;
        if (poz <= mij)
            build(2*nod, s, mij, poz, val);
        else
            build(2*nod+1, mij+1, d, poz, val);
        arb[nod] = arb[2*nod] + arb[2*nod+1];
    }
}
void update (int nod, int s, int d, int indx, int val)
{
    if (indx < s || indx > d)
        return;
    if (s == d)
        arb[nod] -= val;
    else{
        int mij = (s + d) / 2;
        if (indx <= mij)
            update(2*nod, s, mij, indx, val);
        else
            update(2*nod+1, mij+1, d, indx, val);
        arb[nod] = arb[2*nod] + arb[2*nod + 1];
    }
}
int query(int nod, int s, int d, int l, int r)
{
    if (r < s || d < l )
        return 0;
    if (l <= s && d <= r)
        return arb[nod];

    int mij = (s + d) / 2;
    int p1 = query(2*nod, s, mij, l, r);
    int p2 = query(2*nod+1, mij+1, d, l, r);
    return p1 + p2;
}
int main()
{
    int nr, op, i, cod, a, b, x;
    fin >> nr >> op;

    for (i = 1; i <= nr; i++){
        fin >> x;
        build(1, 1, nr, i, x);
    }


   while(op){
        fin >> cod >> a >> b;
        if (cod == 1)
            fout << query(1, 1, nr, a, b) <<"\n";
        else
            update(1, 1, nr, a, b);
        op--;
    }
    return 0;
}