Cod sursa(job #549896)

Utilizator chrissBota Cristian chriss Data 9 martie 2011 00:23:57
Problema Datorii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <stdio.h>

int s,N,M,val,poz,start,finish,zi,minus,Arb[35000];

void update(int nod, int left, int right)
{
    if( left == right )
    {
        Arb[nod] = val;
        return;
    }

    int div = (left + right)/2;

    if(poz <= div) update(2*nod,left,div);
    else           update(2*nod+1,div+1,right);

    Arb[nod] = Arb[2*nod] + Arb[2*nod+1];
}

void update2(int nod, int left, int right)
{
    if( left == right )
    {
        Arb[nod] -= minus;
        return;
    }

    int div = (left + right)/2;

    if(zi <= div) update2(2*nod,left,div);
    else          update2(2*nod+1,div+1,right);

    Arb[nod] -= minus;
}

void query(int nod, int left, int right)
{
    if ( start <= left && finish >= right )
    {
        s += Arb[nod];
        return;
    }
    int div = (left + right)/2;

    if(start <= div )   query(2*nod,left,div);
    if(finish > div)    query(2*nod+1,div+1,right);
}
int main()
{
    int x,a,b;

    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);
        poz = i;
        val = x;
        update(1,1,N);
    }
    for(int i=1; i<=M; ++i)
    {
        scanf("%d%d%d",&x,&a,&b);
        if(x == 1)
        {
            s = 0;
            start = a;
            finish = b;
            query(1,1,N);
            printf("%d\n",s);
        }
        else
        {
            zi = a;
            minus = b;
            update2(1,1,N);
        }
    }
}