Cod sursa(job #649754)

Utilizator elfusFlorin Chirica elfus Data 16 decembrie 2011 17:43:17
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
//Maria Pandele Smaranda mi-a furat sursa. Rusine!!!

#include <stdio.h>
#define LMAX 15000 + 10

int aib [LMAX], step [LMAX];

void MakeSteps (int N)
{
    int i, last = 2;

    step[1] = 1; step[2] = 2;
    for (i = 3; i <= N; i ++)
    {
        if (i == 2 * last)
            step[i] = i, last = last * 2;
        else
            step[i] = step [i - last];
    }
}

void BuildTree (int x, int value, int N)
{
    while (x <= N)
    {
        aib[x] = aib[x] + value;
        x = x + step[x];
    }
}

void Upgrade (int x, int value, int N)
{
    while (x <= N)
    {
        aib[x] = aib[x] - value;
        x = x + step[x];
    }
}

int Query (int x)
{
    int sum = 0;
    while (x)
    {
        sum = sum + aib[x];
        x = x - step[x];
    }

    return sum;
}

int main ()
{
    int N, M, i, type, x, y, sum = 0;

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

    scanf ("%d%d", &N, &M);
    MakeSteps (N);
    for (i = 1; i <= N; i ++)
    {
        scanf ("%d", &x);
        BuildTree (i, x, N);
    }

    while (M --)
    {
        scanf ("%d%d%d", &type, &x, &y);
        if (type == 0)
            Upgrade (x, y, N);
        else
            printf ("%d\n", Query (y) - Query (x - 1));
    }

    return 0;
}