Cod sursa(job #2779630)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 4 octombrie 2021 14:43:21
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>

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

class BIT {
private:
  int n;
  int lg;
  std::vector<int> bit;
  int lsb(int x) {
    return x & (-x);
  }
public:
  BIT(int n) {
    bit.resize(n + 1, 0);
    this -> n = n;
    lg = (int)log2(n + 1) + 1;
  }
  void update(int u, int val) {
    while (u <= n) {
      bit[u] += val;
      u += lsb(u);
    }
  }
  int query(int u) {
    int result = 0;
    while (u > 0) {
      result += bit[u];
      u -= lsb(u);
    }
    return result;
  }
  int lift(int u) {
    int result = 0;
    for (int step = (1 << lg); step > 0 && u > 0; step >>= 1) {
      if ((result + step) <= n && bit[result + step] <= u) {
        result += step;
        u -= bit[result];
        if (u == 0) {
          return result;
        }
      }
    }
    return -1;
  }
};

int n, m;

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