Cod sursa(job #2829153)

Utilizator iancupoppPopp Iancu Alexandru iancupopp Data 8 ianuarie 2022 12:52:03
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <cmath>

using namespace std;

const int N = 1e5 + 5;

int aib[N], n;

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

void update(int poz, int add) {
  while (poz <= n) {
    aib[poz] += add;
    poz += zeros(poz);
  }
}

int query(int poz) {
  int rez = 0;
  while (poz > 0) {
    rez += aib[poz];
    poz -= zeros(poz);
  }
  return rez;
}

int cbin(int sum) {
  int p2max = log2(n), poz = 0;
  for (int i = p2max; i >= 0; --i) {
    int p2 = (1 << i);
    if (poz + p2 <= n && aib[poz + p2] <= sum) {
      sum -= aib[poz + p2];
      poz += p2;
    }
  }
  if (sum > 0)
    return -1;
  return poz;
}

int main() {
  ifstream cin("aib.in");
  ofstream cout("aib.out");
  int q;
  cin >> n >> q;
  for (int i = 1; i <= n; ++i) {
    int val;
    cin >> val;
    update(i, val);
  }
  while (q--) {
    int cer;
    cin >> cer;
    if (cer == 0) {
      int poz, add;
      cin >> poz >> add;
      update(poz, add);
    } else if (cer == 1) {
      int a, b;
      cin >> a >> b;
      cout << query(b) - query(a - 1) << "\n";
    } else {
      int poz;
      cin >> poz;
      cout << cbin(poz) << "\n";
    }
  }
  cin.close();
  cout.close();
  return 0;
}