Cod sursa(job #464564)

Utilizator deneoAdrian Craciun deneo Data 20 iunie 2010 19:51:02
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include<cstdio>
#define zero(x) ( (x ^ (x - 1)) & x )

long aib[15001], n;
void add(int x, int q) //actualizeaza toate intervalele necesare adaugand q
{
    int i;

    for (i = x; i <= n; i += zero(i))
        aib[i] += q;
}

int calc(int x) //calculeaza valoarea secventei 1...x
{
    int i, ret = 0;

    for (i = x; i > 0; i -= zero(i))
        ret += aib[i];
    return ret;
}

int main()
{
    long m, i, aux, i1, i2, x, tp;
    freopen("datorii.in", "rt", stdin);
    freopen("datorii.out", "wt", stdout);
    scanf("%ld%ld", &n, &m);
    for(i=1; i<=n; ++i)
    {
        scanf("%ld", &aux);
        add(i, aux);
    }
    for(i=1; i<=m; ++i)
    {
        scanf("%ld", &tp);
        if(!tp)
        {
            scanf("%ld%ld", &aux, &x);
            add(aux, -x);
        }
        else
        {
            scanf("%ld%ld", &i1, &i2);
            printf("%ld\n", calc(i2)-calc(i1-1));
        }
    }
    return 0;
}