Cod sursa(job #2467149)

Utilizator FlaviusFeteanFetean Flavius FlaviusFetean Data 3 octombrie 2019 19:33:52
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>

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

int arb[31000];

void achitare(int poz, int val, int n)
{
    int i = 1, l = 1, r = n;
    while(l < r){
        arb[i] -= val;
        if(poz <= (l + r)/2) i *= 2, r = (l + r)/2;
        else i = 2*i + 1, l = (l + r)/2 + 1;
    }
    arb[i] -= val;
}

int interogare(int p, int q, int n)
{
    int i = 1, j, l = 1, r = n, s, laux, raux;
    while(p > (l + r)/2 || q <=(l + r)/2){
        if(q <= (l + r)/2) i *= 2, r = (l + r)/2;
        if(p > (l + r)/2) i = i*2 + 1, l = (l + r)/2 +1;
    }
    s = arb[i]; j = i; laux = l, raux = r;
    i *= 2; r = (l + r)/2;
    while(l < r){
        if(p > (l + r)/2){
            s -= arb[2*i];
            i = 2*i + 1;
            l = (l + r)/2 + 1;
        }
        else i *= 2; r = (l + r)/2;
    }
    i = j*2 + 1; r = raux, l = (laux + r)/2 + 1;
    while(l < r){
        if(q <= (l + r)/2){
            s -= arb[2*i + 1];
            i *= 2; r = (l + r)/2;
        }
        else i = 2*i + 1; l = (l + r)/2 + 1;
    }
    return s;
}

int main()
{
    int n, m, i, x, y, t;
    fin >> n >> m;
    for(i = 1; i <= n; i++){
        fin >> x; achitare(i, -x, n);
    }
    for(i = 1; i <= m; i++){
        fin >> t >> x >> y;
        if(!t) achitare(x, y, n);
        else fout << interogare(x, y, n) << "\n";
    }

    return 0;
}