Cod sursa(job #2115041)

Utilizator alex.cojocaruAlex Cojocaru alex.cojocaru Data 26 ianuarie 2018 10:57:18
Problema Datorii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <stdio.h>

#define NMAX 15000 * 4

int v [ NMAX + 1 ] ;
int suma [ NMAX + 1 ] ;

void init(int nod, int st, int dr) {
  if (st == dr) {
    suma[nod] = v[st];
  } else {
    int mij = (st + dr) / 2;
    init(2 * nod, st, mij) ;
    init(2 * nod + 1, mij + 1, dr);
    suma[nod] = suma[2 * nod] + suma[2 * nod + 1];
  }
}

int query(int nod, int st, int dr, int left, int right) {
  if (st == left && dr == right) {
    return suma[nod];
  } else {
    int mij = (st + dr) / 2;
    if (right <= mij)
      return query(2 * nod, st, mij, left, right);
    else if (mij < left)
      return query(2 * nod + 1, mij + 1, dr, left, right);
    else
      return query(2 * nod, st, mij, left, mij)
           + query(2 * nod + 1, mij + 1, dr, mij + 1, right);
  }
}

void update(int nod, int st, int dr, int index, int newValue) {
  if (st == dr) {
    suma[nod] -= newValue;
  } else {
    int mij = (st + dr) / 2;
    if (index <= mij)
      update(2 * nod, st, mij, index, newValue);
    else
      update(2 * nod + 1, mij + 1, dr, index, newValue);
    suma[nod] = suma[2 * nod] + suma[2 * nod + 1];
  }
}


int main()  {

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

  int n, i, m, op, t1, t2 ;

  fscanf (fin, "%d%d", &n, &m ) ;

  for (i = 1 ; i <= n ; i++ )
    fscanf (fin, "%d", &v[i] ) ;
  init(1, 1, n) ;
  for (i = 1 ; i <= m ; i++ ) {
    fscanf (fin, "%d%d%d", &op, &t1, &t2 ) ;
    if (op == 0 )
      update (1, 1, n, t1, t2 ) ;
    else
      fprintf (fout, "%d\n", query (1, 1, n, t1, t2 ) ) ;
  }

  return 0;
}