Cod sursa(job #2018429)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 4 septembrie 2017 21:17:59
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>

using namespace std;

const int MAX_N = 100000;

int aib[MAX_N + 5];

int lastBit(int x) {
  return x & -x;
}

void update(int poz, int val, int n) {
  for (; poz <= n; poz += lastBit(poz))
    aib[poz] += val;
}

int query(int poz) {
  int ans = 0;
  for (; poz; poz -= lastBit(poz))
    ans += aib[poz];
  return ans;
}

int bs(int st, int dr, int val) {
  int last = 0;
  while (st <= dr) {
    int med = (st + dr) / 2;
    if (query(med) < val) {
      last = med;
      st = med + 1;
    } else {
      dr = med - 1;
    }
  }
  if (query(last + 1) == val)
    return last + 1;
  return -1;
}

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

  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) {
    int x;
    scanf("%d", &x);
    update(i, x, n);
  }

  for (int i = 1; i <= m; ++i) {
    int tip;
    scanf("%d", &tip);
    if (tip == 0) {
      int a, b;
      scanf("%d%d", &a, &b);
      update(a, b, n);
    } else if (tip == 1) {
      int a, b;
      scanf("%d%d", &a, &b);
      printf("%d\n", query(b) - query(a - 1));
    } else {
      int a;
      scanf("%d", &a);
      printf("%d\n", bs(1, n, a));
    }
  }

  return 0;
}