Cod sursa(job #3248329)

Utilizator ultra980Alex Stan ultra980 Data 11 octombrie 2024 15:48:15
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <stdio.h>

const int NMAX = 100000;
int aib[NMAX + 1];

int n;

void update(int i, int val) {
  while (i <= n) {
    aib[i] += val;
    i += (i & -i);
  }
}

int query(int i) {
  int sum = 0;
  while (i > 0) {
    sum += aib[i];
    i -= (i & -i);
  }

  return sum;
}

int main() {
  FILE *fin, *fout;
  int m, i, a, b, t, k, lo, hi;

  fin = fopen("aib.in", "r");
  fscanf(fin, "%d%d", &n, &m);
  for (i = 1; i <= n; i++) {
    fscanf(fin, "%d", &a);
    update(i, a);
  }
    fout = fopen("aib.out", "w");
  for (i = 1; i <= m; i++) {
    fscanf(fin, "%d%d", &t, &a);
    switch (t) {
    case 0:
      fscanf(fin, "%d", &b);
      update(a, b);
      break;
    case 1:
      fscanf(fin, "%d", &b);
      fprintf(fout, "%d\n", query(b) - query(a - 1));
      break;
    case 2:
      lo = 0;
      hi = n;
      while (hi - lo > 1) {
        k = (hi + lo) / 2;
        if (query(k) < a)
          lo = k;
        else
          hi = k;
      }
      fprintf(fout, "%d\n", query(hi) == a ? hi : -1);
      break;
    }
  }
  fclose(fin);
  fclose(fout);

  return 0;
}