Cod sursa(job #500971)

Utilizator szabibibiOrban Szabolcs szabibibi Data 13 noiembrie 2010 22:00:18
Problema Datorii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <stdio.h>

#define Nmax 4*15000 + 1

long dat[Nmax];
long n,m,x,type,i,a,b,val;


void update(long,long,long,long,long);
long sum(long,long,long,long,long);

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

    scanf("%ld %ld",&n,&m);
    for (i=1;i<=n;i++)
    {
        scanf("%ld",&x);
        update(1,1,n,i,-x);
    }

    for (i=1;i<=m;i++)
    {
        scanf("%ld %ld %ld", &type, &a, &b);
        if (type)
        {
            val = sum(1,1,n,a,b);
            printf("%ld\n", val);
        }
        else
        {
            update(1,1,n,a,b);
        }
    }

    return 0;
}


void update(long csucs, long e, long v, long a, long b)
{
    long k = (e+v)/2;
    dat[csucs] -= b;

    if (a>k && e!=v)
        update(2*csucs + 1, k+1, v, a, b);
    else if (e!=v)
        update (2*csucs, e, k, a, b);
}

long sum(long csucs, long e, long v, long a , long b)
{
    long k = (e+v)/2;
    long m1=0, m2=0;
    if (a<=e && b>=v)
        return dat[csucs];
    else
    {
        if (a<=k)
            m1 = sum(2*csucs, e, k, a, b);
        if (b>k)
            m2 = sum(2*csucs+1,k+1,v,a,b);
        return m1 + m2;
    }
    return 0;
}