Cod sursa(job #352717)

Utilizator irene_mFMI Irina Iancu irene_m Data 3 octombrie 2009 12:16:09
Problema Datorii Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>
#define MaxN 15050
#define fs(x)     ((x)*2)
#define fd(x)     ((x)*2+1)

long N,M,arb[4*MaxN],pos,val,i,op,a,b,S;

void Update(long nod,long st,long dr)
{
      if(st==dr)
      {
            arb[nod]+=val;
            return;
      }
      long div=(st+dr)/2;
      if(pos<=div)
            Update(fs(nod),st,div);
      else
            Update(fd(nod),div+1,dr);
      arb[nod]=arb[fs(nod)]+arb[fd(nod)];
}

void Query(long nod,long st,long dr)
{
      if(st>=a && dr<=b)
      {
            S+=arb[nod];
            return;
      }
      long div=(st+dr)/2;
      if(a<=div)
            Query(fs(nod),st,div);
      if(div<b)
            Query(fd(nod),div+1,dr);
}

int main()
{
      freopen("datorii.in","r",stdin);
      freopen("datorii.out","w",stdout);
      scanf("%d%d",&N,&M);

      for(i=1;i<=N;i++)
      {
            scanf("%ld",&val);
            pos=i;
            Update(1,1,N);
      }

      for(i=1;i<=M;i++)
      {
            scanf("%ld%ld%ld",&op,&a,&b);
            if(op)
            {
                  S=0;
                  Query(1,1,N);
                  printf("%ld\n",S);
            }
            else
            {
                  pos=a;
                  val=-b;
                  Update(1,1,N);
            }
      }
      return 0;
}