Cod sursa(job #70403)

Utilizator Darth_NiculusIvan Nicolae Darth_Niculus Data 5 iulie 2007 20:48:37
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
/* Ivan Nicolae - Bucuresti */
/* Datorii - Arbori de Intervale */
#include <stdio.h>

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

int i,n,m,AI[2*NMAX];

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

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

int Question(int nod, int l, int r, int x, int y)
{
 if (x<=l && r<=y)
   return AI[nod];
   else {
         int mij=(l+r)/2,rez_l=0,rez_r=0;
         if (x<=mij && 2*nod<2*NMAX)   rez_l=Question(2*nod,l,mij,x,y);
         if (y> mij && 2*nod+1<2*NMAX) 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_add(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_sub(1,1,n,y,y,z);
       else printf("%d\n",Question(1,1,n,y,z));
    }

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