Cod sursa(job #2386600)

Utilizator cristina-criCristina cristina-cri Data 23 martie 2019 11:46:34
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <cmath>
#include <algorithm>
#define NMAX 15005

using namespace std;

int arb[NMAX*4], x, n, m, k, cod, a, b;
double lungime, klung;

void init(int poz, int nr)
{
    if(poz < 1)
        return;
    arb[poz]+=nr;
    init(poz/2, nr);
}

int cauta(int st, int dr, int poz_arb, int a, int b)
{
    if(st >= a && dr <= b)
        return arb[poz_arb];
    if(st > b || dr < a)
        return 0;
    int med=(st+dr)/2;
    return cauta(st, med, 2*poz_arb, a, b) + cauta(med+1, dr, 2*poz_arb+1, a, b);
}


int main()
{

    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);

    scanf("%d %d", &n, &m);
    lungime=(double) n;
    klung=log2(lungime);
    klung=ceil(klung);
    k=klung;
    k=(1<<(k));
    //printf("%d", k);
    for(int i=1; i<=n; i++)
    {
        scanf("%d", &x);
        arb[k+i-1]=x;
        init((k+i-1)/2, x);
    }
    //printf("%d", arb[1]);
    for(int i=1; i<=m; i++)
    {
        scanf("%d %d %d", &cod, &a, &b);
        if(cod == 0)
        {
            b=b*(-1);
            init(k+a-1, b);
        }
        else
        {
            printf("%d\n", cauta(1, k, 1, a, b));
        }
    }

    return 0;
}