Cod sursa(job #2386555)

Utilizator ana.pintiliciucAna Maria Pintiliciuc ana.pintiliciuc Data 23 martie 2019 11:08:52
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <cstdio>
#define NMAX 15005
#include <cmath>
#include <algorithm>

using namespace std;

int arb[4*NMAX], k, n, m, x, cer, a, b;

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

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);
    double aux=log2(n);
    aux=ceil(aux);
    k=aux;
    k=(1<<(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", &cer, &a, &b);
        if(cer==0)
        {
            b=b*(-1);
            init(k+a-1, b);
            //printf("%d\n", arb[1]);
        }
        else
        {
            printf("%d\n", cauta(1, k, 1, a, b));
        }
    }

    return 0;
}