Cod sursa(job #1410001)

Utilizator andrei_r_97Radoi Andrei andrei_r_97 Data 30 martie 2015 20:06:43
Problema Datorii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <stdio.h>

#define MAX 32768

int suma[MAX];

void update(int nod, int left, int right, int val, int pos, int operatie) {

  if (left == right) {
    suma[nod] += (val * operatie);
    return;
  }

  int mid = (left + right) / 2;
  if (mid >= pos) {
    update(2 * nod, left, mid, val, pos, operatie);
  }
  else {
    update(2 * nod + 1, mid + 1, right, val, pos, operatie);
  }

  suma[nod] = suma[2 * nod] + suma[2 * nod + 1];
}

int query(int nod, int left, int right, const int start, const int stop) {

  if (left >= start && right <= stop) {
    return suma[nod];
  }

  int a = 0, b = 0;
  int mid = (left + right) / 2;

  if (start <= mid) {
    a = query(2 * nod, left, mid, start, stop);
  }
  if (mid < stop) {
    b = query(2 * nod + 1, mid + 1, right, start, stop);
  }

  return a + b;

}

int main() {

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

  int n, m;
  fscanf(in, "%d %d", &n, &m);

  int i, nr;
  for (i = 1; i <= n; i++) {
    fscanf(in, "%d", &nr);
    update(1, 1, n, nr, i, 1);
  }

  int a, b, operatie;
  for (i = 1; i <= m; i++) {
    fscanf(in, "%d", &operatie);
    switch (operatie) {
    case 0:
      fscanf(in, "%d %d", &a, &b);
      update(1, 1, n, b, a, -1);
      break;
    case 1:
      fscanf(in, "%d %d", &a, &b);
      fprintf(out, "%d\n", query(1, 1, n, a, b));
      break;
    }
  }

  fclose(in);
  fclose(out);

  return 0;
}