Cod sursa(job #2590734)

Utilizator anabatAna Batrineanu anabat Data 28 martie 2020 19:28:33
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <stdio.h>

#define NMAX 15000*4

int aint[NMAX+1], v[NMAX+1];

void update(int nod, int st, int dr, int poz, int val){
  if(st==dr){ ///suntem la o frunza
    aint[nod]=val;
  }
  else{
    int mij=(st+dr)/2;
    if(poz<=mij){ ///ne ducem in fiul stanga
      update(2*nod,st,mij,poz,val);
    }
    else{ ///ne ducem in fiul dreapta
      update(2*nod+1,mij+1,dr,poz,val);
    }
    aint[nod]=aint[2*nod]+aint[2*nod+1];
  }
}

int query(int nod, int st, int dr, int left, int right){
  if(st==left&&dr==right){ ///am gasit intervalul
    return aint[nod];
  }
  else{
    int mij=(st+dr)/2;
    if(right<=mij){ ///ne ducem doar intr un fiu (stg)
      return query(2*nod,st,mij,left,right);
    }
    else if(left>mij){ ///(dr)
      return query(2*nod+1,mij+1,dr,left,right);
    }
    else{ ///avem interval din ambii fii
      return query(2*nod,st,mij,left,mij)+query(2*nod+1,mij+1,dr,mij+1,right);
    }
  }
}

int main()
{
  FILE *fin,*fout;
  fin=fopen("datorii.in","r");
  fout=fopen("datorii.out","w");

  int n,m,i,j,q,a,b;
  fscanf(fin,"%d%d",&n,&m); /// n nr, m operatii
  for(i=1;i<=n;i++){
    fscanf(fin,"%d",&v[i]); ///sirul de nr
    update(1,1,n,i,v[i]); ///construiesc aintul
  }
  for(i=1;i<=m;i++){
    fscanf(fin,"%d%d%d",&q,&a,&b);
    if(q==0){ ///update ///nr se aduna in aint
      update(1,1,n,a,v[a]-b); ///a=poz,b=val
    }
    else if(q==1){ ///suma nr de pe intervalul left,right (a,b)
      fprintf(fout,"%d\n",query(1,1,n,a,b)); ///a=left, b=right
    }
  }

  fclose(fin);
  fclose(fout);
  return 0;
}