Cod sursa(job #301906)

Utilizator drag0shSandulescu Dragos drag0sh Data 8 aprilie 2009 15:23:50
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>
FILE *in=fopen("datorii.in","r"),*out=fopen("datorii.out","w");

#define dim 15001

int n,m,maxarb[4*dim+66],start,finish,val,pos,suma;

void update(int nod,int left, int right){
  //  fprintf(out,"(%d,%d)",left,right);
  if(left==right){
    maxarb[nod]+=val;
    return;
  }
  
  int div=(left+right)/2;
  if(pos<=div)update(nod*2,left,div);
  else        update(nod*2+1,div+1,right);
  maxarb[nod]=maxarb[nod*2]+maxarb[nod*2+1];
  //  fprintf(out,"||S=%d=(%d,%d)+(%d,%d)",maxarb[nod],left,div,div+1,right);
}

void query(int nod,int left,int right){
  // fprintf(out,"(%d,%d)",left,right);
  if(start<=left&&right<=finish){
    suma+=maxarb[nod];
    //fprintf(out,"(%d,%d)",left,right);
    return;
  }
  int div=(left+right)/2;
  if(start<=div)query(nod*2,left,div);
  if(div<finish)query(nod*2+1,div+1,right);
  //fprintf(out,"||S=%d=(%d,%d)+(%d,%d)",maxarb[nod],left,div,div+1,right);
  }

void solve(){
  int x,a,b,i;
  fscanf(in,"%d%d",&n,&m);
  for(i=1;i<=n;i++){
    fscanf(in,"%d",&x);
    //fprintf(out,"\n<%d_ %d>",i,x);
    pos=i,val=x;
    update(1,1,n);
  }
  for(i=1;i<=m;i++){
    fscanf(in,"%d%d%d",&x,&a,&b);
    if(x){
      suma=0;
      start=a;
      finish=b;
      query(1,1,n);
      fprintf(out,"%d\n",suma);
    }
    else{
      pos=a;
      val=b*(-1);
      update(1,1,n);
    }
  }
}

int main(){
   solve();
  
  
  fclose(in);
  fclose(out);
  return 0;
}