Cod sursa(job #69586)

Utilizator randommanThe Randomizer randomman Data 3 iulie 2007 16:21:22
Problema Datorii Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
/* Ivan Nicolae - Bucuresti */
/* Datorii - Arbori De Intervale */
#include <stdio.h>

#define NMAX 15001
#define _fin  "datorii.in"
#define _fout "datorii.out"

struct node
{
 int l, r, suma;
} AI[NMAX*5];

int i,n,m;

void Update_plus(int nod, int l, int r, int x, int y, int cat)
{
 AI[nod].l=l; AI[nod].r=r;
 if (x<=l && r<=y)
   AI[nod].suma+=cat;
   else {
         int mij=(l+r)/2;
         if (x<= mij) Update_plus(2*nod,l,mij,x,y,cat);
         if (y>  mij) Update_plus(2*nod+1,mij+1,r,x,y,cat);
         AI[nod].suma=AI[2*nod].suma + AI[2*nod+1].suma;
        }
}

void Update_minus(int nod, int l, int r, int x, int y, int cat)
{
 AI[nod].l=l; AI[nod].r=r;
 if (x<=l && r<=y)
   AI[nod].suma-=cat;
   else {
         int mij=(l+r)/2;
         if (x<= mij) Update_minus(2*nod,l,mij,x,y,cat);
         if (y>  mij) Update_minus(2*nod+1,mij+1,r,x,y,cat);
         AI[nod].suma=AI[2*nod].suma + AI[2*nod+1].suma;
        }
}

int Question(int nod, int l , int r, int x, int y)
{
 if (x<=l && r<=y)
   return AI[nod].suma;
   else {
         int mij=(l+r)/2,rez_l=0,rez_r=0;
         if (x<=mij) rez_l=Question(2*nod,l,mij,x,y);
         if (y> mij) rez_r=Question(2*nod+1,mij+1,r,x,y);
         return (rez_l+rez_r);
        }
}

int main(void)
{
 freopen(_fin,"r",stdin);
 freopen(_fout,"w",stdout);

 scanf("%d%d",&n,&m);
 for (i=1;i<=n;i++)
    {
     int x;
     scanf("%d",&x);
     Update_plus(1, 1, n, i, i, x);
    }

 for (i=1;i<=m;i++)
    {
     int x, y, z;
     scanf("%d%d%d",&x,&y,&z);
     if (!x)
       Update_minus(1, 1, n, y, y, z);
       else printf("%d\n",Question(1, 1, n, y, z));
    }

 fclose(stdin);
 fclose(stdout);
 return 0;
}