Cod sursa(job #1097948)

Utilizator binicBinica Nicolae binic Data 4 februarie 2014 11:44:23
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <cstdio>
#define LSB(x) ((-x)&x)
using namespace std;

int x,N,M,i,aib[100005],t,a,b;
void Update2(int V,int Pos)
{
    int i;
    for(i=Pos;i<=N;i=i+LSB(i))
            aib[i]=aib[i]-V;
}
void Update1(int V,int Pos)
{
    int i;
    for(i=Pos;i<=N;i=i+LSB(i))
            aib[i]=aib[i]+V;
}

int Suma(int Pos)
{
    int i,s=0;
    for(i=Pos; i>0; i-=LSB(i))
            s=s+aib[i];
    return s;
}

int query(int P1,int P2)
{
    return (Suma(P2)-Suma(P1-1));
}


int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    scanf("%d%d",&N,&M);
    for( i = 1; i <= N; i++ )
    {
        scanf("%d",&x);
        Update1(x,i);
    }
    while(M>0)
    {
        M--;
        scanf("%d",&t);
        if ( t==0 )
        {
                scanf("%d%d\n",&a,&b);
                Update2( b, a );
        }
        else
        if (t==1)
        {
                scanf("%d%d\n",&a,&b);
                printf("%d\n",query(a,b));
        }
    }
    return 0;
}