Cod sursa(job #196362)

Utilizator sigridMaria Stanciu sigrid Data 26 iunie 2008 04:38:15
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<stdio.h>
#define dim 15001

unsigned long v[dim*3],aux[dim],n,m,sum;

void add(unsigned long nod, unsigned long st, unsigned long dr)
{if(st==dr) v[nod]=aux[st];
  else
   {unsigned long jum=(st+dr)/2;
    add(nod*2,st,jum);
    add(nod*2+1,jum+1,dr);
    v[nod]=v[nod*2]+v[nod*2+1];
   }
}

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

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

int main()
{
unsigned long i,k,x,y;

freopen("datorii.in","rt",stdin);
freopen("datorii.out","wt",stdout);

scanf("%ld %ld",&n,&m);
for(i=1;i<=n;i++)
 scanf("%ld",&aux[i]);

add(1,1,n);

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

return 0;

}