Cod sursa(job #2386592)

Utilizator AntoniuFicAntoniu Ficard AntoniuFic Data 23 martie 2019 11:40:48
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <cmath>
#define zeros(x) ( (x ^ (x - 1)) & x )

using namespace std;

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

int n, v[15000], m, arbint[1000000], k, nn;

void modifPos(int pos, int val){
    while(pos > 1){
        arbint[pos]-=val;
        if(arbint[pos] < 0)
            arbint[pos] = 0;
        pos/=2;
    }
    arbint[1] -= val;
    if(arbint[1] < 0)
        arbint[1] = 0;
    return;
}

int findOnInterval(int a, int b, int pos = 1, int aa = 1, int ab = k){
    if((aa == a && b == ab) || (aa == ab))
        return arbint[pos];
    int mij = (aa + ab) / 2;
    if(a>mij && b>mij)
        return findOnInterval(a, b, pos * 2 + 1, mij + 1, ab);
    else if(a<= mij &&  b<=mij)
        return findOnInterval(a, b, pos * 2, aa, mij);
    return findOnInterval(a, b, pos * 2, aa, mij) + findOnInterval(a, b, pos * 2 +1, mij + 1, ab);
}

int main()
{
    f>>n>>m;
    for(int i=1; i<=n; i++){
        f>>v[i];
    }
    k = (int)log2(n) + 2;
    nn = (1<<k);
    k = (1<<(k-1));
    for(int i=nn-k-1, j=0; i<nn; i+=2, j+=2){
        arbint[i] = v[j], arbint[i+1]=v[j+1];
    }
    for(int lvl = (k >> 1); lvl >= 1; lvl = (lvl >> 1)){
        for(int i=lvl; i<(lvl<<1); i++){
            arbint[i] = arbint[i * 2] + arbint[i * 2 + 1];
        }
    }
    for(int i=0; i<m; i++){
        int a, b, code;
        f>>code>>a>>b;
        if(code == 0){
            a+=k-1;
            modifPos(a, b);
            continue;
        }
        g<<findOnInterval(a, b)<<"\n";
    }
}