Cod sursa(job #1460348)

Utilizator mirupetPetcan Miruna mirupet Data 12 iulie 2015 14:06:24
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<cstdio>
using namespace std;

int N, M, p, X, Y;
int arb[15001];
int v[15001];
int C, S;

int Maxim(int a)
{
    if ( a > 0)
        return a;
    return 0;
}

void Update(int poz, int val)
{
    C = 0;
    if (val > v[poz])
    val = v[poz];
    v[poz] -= val;

    while (poz <= N)
    {
        arb[poz] -= val;
        while ( !(poz & (1<<C)) ) C++;
        poz += (1<<C);
        C += 1;
    }
}

void Update_prim( int poz, int val)
{
    C = 0;

    while (poz <= N)
    {
        arb[poz] += val;
        while ( !(poz & (1<<C)) ) C++;
        poz += (1<<C);
        C += 1;
    }
}

int SUM(int poz)
{
    C = 0; S = 0;
    while (poz > 0)
    {
        S += arb[poz];
        while ( !(poz & (1<<C)) ) C++;
        poz -= (1<<C);
        C++;
    }
    return S;

}

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

        scanf("%d%d", &N, &M);

        for ( int i = 1; i <= N; i++ )
        {
            scanf("%d", &X);
            v[i]=X;
            Update_prim(i, X);
        }

        for ( ; M; M--)
        {
            scanf("%d%d%d", &p, &X, &Y);
            //printf("%d %d %d\n", p, X, Y);

            if (!p)
                Update(X, Y);
            else
                printf("%d\n",SUM(Y) - SUM(X-1));
        }
    }