Cod sursa(job #1767258)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 28 septembrie 2016 21:06:04
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
#define MAXN 15000
int aint[4*MAXN+1];
void update(int nod,int left,int right,int poz,int val){
    if(left==right)
        aint[nod]+=val;
    else{
       int med=(left+right)/2;
       if(poz<=med)
         update(2*nod,left,med,poz,val);
       else
         update(2*nod+1,med+1,right,poz,val);
       aint[nod]=aint[2*nod]+aint[2*nod+1];
    }
}
int ans;
void query(int nod,int left,int right,int l,int r){
     if(l<=left&&right<=r)
        ans+=aint[nod];
     else{
        int med=(left+right)/2;
        if(l<=med)
          query(2*nod,left,med,l,r);
        if(med<r)
          query(2*nod+1,med+1,right,l,r);
     }
}
int main(){
   FILE*fi,*fout;
   int i,n,m,t,x,y;
   fi=fopen("datorii.in" ,"r");
   fout=fopen("datorii.out" ,"w");
   fscanf(fi,"%d %d " ,&n,&m);
   for(i=1;i<=n;i++){
      fscanf(fi,"%d" ,&x);
      update(1,1,n,i,x);
   }
   while(m>0){
      m--;
      fscanf(fi,"%d %d %d " ,&t,&x,&y);
      if(t==0)
        update(1,1,n,x,-y);
      else{
         ans=0;
         query(1,1,n,x,y);
         fprintf(fout,"%d\n" ,ans);
      }
   }
   fclose(fi);
   fclose(fout);
   return 0;
}