Cod sursa(job #157454)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 13 martie 2008 00:37:30
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<stdio.h>
int n,a[15002],m[60100];
int k1,k2,k3,mm,i;
int inita(int nod, int b, int e)
{
   if (b==e) m[nod]=a[b];
    else
      {
       inita(2*nod,b,(b+e)/2);
       inita(2*nod+1,(b+e)/2+1,e);
       m[nod]=m[2*nod]+m[2*nod+1];
      }
}
int query(int nod,int b,int e,int s,int d)
{
  int sums,sumd;
 if (d<b||s>e) return 0;
   else
 if (s<=b&&e<=d) return m[nod];
   else
     {
     if (s<=(b+e)/2) sums=query(2*nod,b,(b+e)/2,s,d);
     if (d>(b+e)/2) sumd=query(2*nod+1,(b+e)/2+1,e,s,d);
     return sums+sumd;
     }
}
int Update(int nod,int b,int e)
{
   if (b==e) m[nod]=a[b];
    else
      {
      if (k2<=(b+e)/2) inita(2*nod,b,(b+e)/2);
               else    inita(2*nod+1,(b+e)/2+1,e);
       m[nod]=m[2*nod]+m[2*nod+1];
      }
 return 0;
}
int main()
{
   freopen("datorii.in","r",stdin);
   freopen("datorii.out","w",stdout);
   scanf("%ld %ld",&n,&mm);
   for(i=1;i<=n;i++)
    scanf("%ld",&a[i]);
   inita(1,1,n);
   for(i=1;i<=mm;i++)
   {
    scanf("%ld %ld %ld",&k1,&k2,&k3);
    if (!k1) {a[k2]-=k3;Update(1,1,n);}
    if (k1) printf("%ld\n",query(1,1,n,k2,k3));
   }
   return 0;
}