Cod sursa(job #1460513)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 12 iulie 2015 20:47:27
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <stdio.h>

#define MAX_N 100000

int aint[2 * MAX_N];
int n;

inline int log2(int a) {
  int q;

  asm("bsr %1, %0" : "=r" (q) : "r" (a));
  return q;
}

int sumInt(int a, int b) {
  int sum = 0;

  a += n;
  b += n;

  while (a < b) {
    if (a & 1) {
      sum += aint[a++];
    }
    if (b & 1) {
      sum += aint[--b];
    }
    a /= 2;
    b /= 2;
  }
  return sum;
}

int main(void) {
  FILE *f = fopen("aib.in", "r");
  FILE *g = fopen("aib.out", "w");
  int m;
  char opType;
  int a, b;
  int k;

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

  for (int i = 0; i < n; i++) {
    fscanf(f, "%d", &aint[n + i]);
  }

  for (int i = n - 1; i; i--) { // initializare de jos in sus
    aint[i] = aint[2 * i] + aint[2 * i + 1];
  }

  for (; m; m--) {
    fscanf(f, " %c %d", &opType, &a);

    if (opType == '1') {
      fscanf(f, "%d", &b);
      fprintf(g, "%d\n", sumInt(a - 1, b));
    } else if (opType == '0') {
      fscanf(f, "%d", &b);
      a = a + n - 1;
      aint[a] += b;
      while (a > 1) {
        int q = a / 2;
        aint[q] += b;
        a = q;
      }
    } else {
      k = 0;
      for (int step = log2(n); step >= 0; step--) {
        if ((k | (1 << step)) <= n && sumInt(0, (k | (1 << step))) < a) {
          k |= (1 << step);
        }
      }
      fprintf(g, "%d\n", (sumInt(0, k + 1) == a) ? k + 1 : -1);
    }
  }
  fclose(f);
  fclose(g);
  return 0;
}