Cod sursa(job #2449662)

Utilizator ejoi2019Ejoi 2019 ejoi2019 Data 20 august 2019 13:51:06
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>

using namespace std;

const int N = 100001;
int n, m;
int t[N];

void add(int p, int x) {
  while (p <= n) {
    t[p] += x;
    p += p & (-p);
  }
}

int get(int p) {
  int r = 0;
  while (p) {
    r += t[p];
    p -= p & (-p);
  }
  return r;
}



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


  scanf("%d %d", &n, &m);
  int k = 0;
  while ((1 << (k + 1)) <= n)
    k++;
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    add(i, x);
  }
  for (int i = 1; i <= m; i++) {
    int tp;
    scanf("%d", &tp);
    if (tp == 0) {
      int a, b;
      scanf("%d %d", &a, &b);
      add(a, b);
    }
    if (tp == 1) {
      int a, b;
      scanf("%d %d", &a, &b);
      printf("%d\n", get(b) - get(a - 1));
    }
    if (tp == 2) {
      int a, b;
      scanf("%d", &a);
      b = a;
      int r = 0, step = (1 << k);
      while (step) {
        if (r + step <= n && t[r + step] < a) {
          r += step;
          a -= t[r];
        }
        step /= 2;
      }
      r++;
      if (get(r) != b)
        r = -1;
      printf("%d\n", r);
    }
  }

  return 0;
}