Cod sursa(job #988887)

Utilizator ludacrivasilii teodorovici ludacri Data 24 august 2013 11:00:59
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#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;
}