Cod sursa(job #2574612)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 6 martie 2020 00:28:43
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>

using namespace std;

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

const int MAX_N = 1e5 + 5;

int m, n;

int bit[MAX_N];

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

void update(int pos, int value) {
  int p;
  p = pos;
  while (p <= n) {
    bit[p] += value;
    p += lsb(p);
  }
}

int query(int pos) {
  int p, ans;
  p = pos;
  ans = 0;
  while (p > 0) {
    ans += bit[p];
    p -= lsb(p);
  }
  return ans;
}

int bin(int value) {
  int ans, step, sum;
  ans = sum = 0;
  step = (1 << (1 + int(log2(n))));
  while (step > 0 && value > 0) {
    if (step + ans <= n && bit[step + ans] <= value) {
      ans += step;
      value -= bit[ans];
    }
    if (value == 0) {
      return ans;
    }
    step >>= 1;
  }
  return - 1;
}

int main() {
  int op, a, b;
  fin >> n >> m;
  for (int i = 1; i <= n; ++i) {
    fin >> a;
    update(i, a);
  }
  while (m --) {
    fin >> op >> a;
    if (op == 0) {
      fin >> b;
      update(a, b);
    } else if (op == 1) {
      fin >> b;
      fout << query(b) - query(a - 1) << "\n";
    } else {
      fout << bin(a) << "\n";
    }
  }
  return 0;
}