Cod sursa(job #218537)

Utilizator mircea_infoSuciu Mircea-Gabriel mircea_info Data 2 noiembrie 2008 14:14:09
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <cstdio>
#define MAXIMUS 15001
#define f(x)((x^(x-1))&x)

using namespace std;

int n,m,arb[MAXIMUS],val;

void update(int pozitie,int valoare,int sign)
{
    while(pozitie<=n)
    {
        if(sign==1)
            arb[pozitie]+=valoare;
        else
            arb[pozitie]-=valoare;
        pozitie+=f(pozitie);
    }
}

int solve(int x)
{
    int sum=0;
    while(x)
    {
        sum+=arb[x];
        x-=f(x);
    }
    return sum;
}

int main(){
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&val);
        update(i+1,val,1);
    }
    int type,x,y;
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d",&type,&x,&y);
        if(type==1)
            printf("%d\n", solve(y)-solve(x-1));
        else
            update(x,y,0);
    }
    fclose(stdout);
    return 0;
}