Cod sursa(job #60218)

Utilizator devilkindSavin Tiberiu devilkind Data 13 mai 2007 09:52:16
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <stdio.h>
#define NMAX 15002

long int arb[NMAX*3],i,j,k,n,m,a[NMAX],sum;

void citire()
{
freopen("datorii.in","rt",stdin);
freopen("datorii.out","wt",stdout);
scanf("%ld %ld",&n,&m);
for (i=1;i<=n;i++)
        scanf("%ld",&a[i]);
}

void build(long int nod, long int st, long int dr)
{
if (st==dr) arb[nod]=a[st];
        else {
             long int mid=(st+dr)/2;
             build(nod*2,st,mid);
             build(nod*2+1,mid+1,dr);
             arb[nod]=arb[nod*2]+arb[nod*2+1];
             }
}

void update(long int nod, long int st, long int dr, long int poz, long int val)
{
if (st==dr) arb[nod]-=val;
        else {
             long int mid=(st+dr)/2;
             if (poz<=mid) update(nod*2,st,mid,poz,val);
                else update(nod*2+1,mid+1,dr,poz,val);
             arb[nod]=arb[nod*2]+arb[nod*2+1];
             }
}

void query(long int nod, long int st, long int dr, long int a, long int b)
{
if ((a<=st)&&(dr<=b)) sum+=arb[nod];
        else {
             long int mid=(st+dr)/2;
             if (a<=mid) query(nod*2,st,mid,a,b);
             if (b>mid) query(nod*2+1,mid+1,dr,a,b);
             }
}

void answer()
{
long int k,x,y;
for (i=1;i<=m;i++)
        {
        scanf("%ld %ld %ld",&k,&x,&y);
        if (k==0) update(1,1,n,x,y);
                else {sum=0;
                      query(1,1,n,x,y);
                      printf("%ld\n",sum);
                      }
        }
}

int main()
{
citire();
build(1,1,n);
answer();
}