Cod sursa(job #11575)

Utilizator crawlerPuni Andrei Paul crawler Data 31 ianuarie 2007 21:23:08
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>

long v[225356], a,b, S;

void update(long ind,long st,long dr)
 {
  if(st==dr)
   {
    v[ind]-=b;
   }
    else
   {
    long sc=(st+dr)>>1;
    
    if(a<=sc)
     update(ind<<1,st,sc);
     
    if(sc<a)
     update((ind<<1)+1,sc+1,dr);

    v[ind]=v[ind<<1]+v[(ind<<1)+1];
   }
 }

void make(long ind,long st,long dr)
 {
  if(st==dr)
   {
    v[ind]=b;
   }
    else
   {
    long sc=(st+dr)>>1;
    
    if(a<=sc)
     make(ind<<1,st,sc);
     
    if(sc<a)
     make((ind<<1)+1,sc+1,dr);

    v[ind]=v[ind<<1]+v[(ind<<1)+1];
   }
 }

void query(long ind,long st,long dr)
 {
  if(a<=st && dr<=b)
   {
    S+=v[ind];
   }
    else
   {
     long sc=(st+dr)>>1;

     if(a<=sc)
      query(ind<<1,st,sc);

     if(sc<b)
      query((ind<<1)+1,sc+1,dr);
   }
 }

int main()
 {
  freopen("datorii.in","r",stdin);
  freopen("datorii.out","w",stdout);

  register long i,n,m,tmp;


  scanf("%ld%ld",&n,&m);
  
  for(i=1;i<=n;++i)
    {
     scanf("%ld",&b);
     a=i;
     make(1,1,n);
    }


   for(i=1;i<=m;++i)
    {
     scanf("%ld",&tmp);
     if(tmp)
      {
       scanf("%ld%ld",&a,&b);
       S=0;
       query(1,1,n);
       printf("%ld\n", S);
      }
       else
      {
       scanf("%ld%ld",&a,&b);
       update(1,1,n);
      }
    }


  return 0;
 }