Cod sursa(job #204102)

Utilizator MisterXGrigore MisterX Data 21 august 2008 20:00:11
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 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;   
  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;   
     }   
  return 0;   
}   
int Update(int nod,int b,int e)   
{   
   if (b==e) m[nod]=a[b];   
    else  
      {   
      if (k2<=(b+e)/2) Update(2*nod,b,(b+e)/2);   
               else    Update(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;   
}  
#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;
  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;
     }
  return 0;
}
int Update(int nod,int b,int e)
{
   if (b==e) m[nod]=a[b];
    else
      {
      if (k2<=(b+e)/2) Update(2*nod,b,(b+e)/2);
               else    Update(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;
}