Cod sursa(job #2737658)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 4 aprilie 2021 22:57:42
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("aib.in");
ofstream out("aib.out");

const int lg = 20;
const int max_n = (int)1e5 + 5;

int n, m;

int bit[max_n];

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

void add(int pos, int val) {
  for (int i = pos; i <= n; i += lsb(i)) {
    bit[i] += val;
  }
}

int query(int pos) {
  int ans = 0;
  for (int i = pos; i > 0; i -= lsb(i)) {
    ans += bit[i];
  }
  return ans;
}

int lift(int value) {
  int ans = 0;
  for (int step = (1 << lg); step > 0; step >>= 1) {
    if ((ans + step) <= n && bit[ans + step] <= value) {
      ans += step;
      value -= bit[ans];
    }
    if (value == 0) {
      return ans;
    }
  }
  return -1;
  /*int step = (1 << 30);
  int ans = 0;
  while (step > 0 && value > 0) {
    if ((ans + step) <= n && bit[ans + step] <= value) {
      ans += step;
      value -= bit[ans];
      if (value == 0) {
        return ans;
      }
    }
    step >>= 1;
  }
  return - 1;*/
}

int main() {
  in >> n >> m;
  for (int i = 1; i <= n; i++) {
    int val;
    in >> val;
    add(i, val);
  }
  for (int i = 1; i <= m; i++) {
    int op, x, y;
    in >> op >> x;
    if (op == 0) {
      in >> y;
      add(x, y);
    } else if (op == 1) {
      in >> y;
      out << query(y) - query(x - 1) << "\n";
    } else if (op == 2) {
      out << lift(x) << "\n";
    }
  }
  return 0;
}