Cod sursa(job #1972274)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 22 aprilie 2017 17:55:36
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>

int N, M;

const int MAX_N = 100000;

int aib[5 + MAX_N];

int terminal0(int x) {
  return (x ^ (x - 1)) & x;
}

void add(int poz, int val) {
  for (int i = poz; i <= N; i += terminal0(i)) {
    aib[i] += val;
  }
}

int compute(int poz) {
  int s = 0;
  for (int i = poz; i >= 1; i -= terminal0(i))
    s += aib[i];
  return s;
}

int binarySearch(int x) {
  int st, dr, last = -1;
  st = 1;
  dr = N;
  while (st <= dr) {
    int med = (st + dr) / 2;
    int val = compute(med);
    if (val < x) {
      st = med + 1;
    } else {
      if (val == x) {
        last = med;
      }
      dr = med - 1;
    }
  }
  return last;
}

int main() {
  freopen ("aib.in", "r", stdin);
  freopen ("aib.out", "w", stdout);

  scanf("%d%d", &N, &M);
  for (int i = 1; i <= N; ++i) {
    int x;
    scanf("%d", &x);
    add(i, x);
  }
  for (int i = 1; i <= M; ++i) {
    int tip, a;
    scanf("%d%d", &tip, &a);
    if (tip == 2) {
      printf("%d\n", binarySearch(a));
    } else {
      int b;
      scanf("%d", &b);
      if (tip == 0) {
        add(a, b);
      } else {
        printf("%d\n", compute(b) - compute(a - 1));
      }
    }
  }
  return 0;
}