Cod sursa(job #187079)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 30 aprilie 2008 13:31:55
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<stdio.h>
#define Max 500000

int Arb[Max],n,m,x,a,b,Pos,Val,inc,sf,suma,i;

void citire();
void update(int,int,int);
void query(int,int,int);


int main(){
    citire();
    return 0;
}

void citire(){
     freopen("datorii.in","r",stdin);
     freopen("datorii.out","w",stdout);
     scanf("%d %d",&n,&m);
     for (i=1;i<=n;i++) {
         scanf("%d",&x);
         Pos=i;Val=x;
         update(1,1,n);
     }
     for (i=1;i<=m;i++){
         scanf("%d %d %d",&x,&a,&b);
         if (x==0)
         {
             Pos=a;Val=-b;
             update(1,1,n);
         }
         else
         {
             suma=0;
             inc=a;sf=b;
             query(1,1,n);
             printf("%d\n",suma);
         }
     }
}

void update(int nod, int left, int right){
     if (left==right)
     {
		     Arb[nod]+=Val;
                     return;
     }
     int mij=(left+right)/2;
     
     if (Pos<=mij) update(2*nod,left,mij);
     else          update(2*nod+1,mij+1,right);
     
     Arb[nod]=Arb[2*nod]+Arb[2*nod+1];
}

void query(int nod,int left,int right) {  
     if (inc<=left && right<=sf)
     {
                   suma+=Arb[nod];
                   return;
     }
     int mij=(left+right)/2;
     if (inc<=mij) query(2*nod,left,mij);
     if (mij<sf)   query(2*nod+1,mij+1,right);
     
}