Cod sursa(job #3131443)

Utilizator SorinBossuMarian Sorin SorinBossu Data 20 mai 2023 11:13:42
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <iostream>
using namespace std;

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

constexpr size_t nmax = 100001;

long long a[nmax], aib[nmax];
void build(int n) {
  for (int i = 1; i <= n; ++i) {
    int p = i + (i & -i);
    if (p <= n)
      aib[p] += aib[i];
  }
}

long long sum(int n) {
  long long rez = 0;
  while (n != 0) {
    rez += aib[n];
    n -= n & -n;
  }
  return rez;
}

void update(int n, int v, long long val) {
  while (v <= n) {
    aib[v] += val;
    v += v & -v;
  }
}
int main() {
  int n, m;
  in >> n >> m;
  for (int i = 1; i <= n; ++i)
    in >> a[i], aib[i] = a[i];
  build(n);

  for (int i = 1; i <= m; ++i) {
    int op, st, dr;
    in >> op;
    if (op == 2) {
      int val;
      in >> val;
      int l = 1, r = n, poz = -1;
      while (l <= r) {

        int mij = (l + r) / 2;
        int su = sum(mij);
        if (su == val)
          poz = mij;
        if (su >= val)
          r = mij - 1;
        else
          l = mij + 1;
      }
      out << poz << "\n";
      continue;
    }
    in >> st >> dr;
    if (op == 0)
      update(n, st, dr);
    else
      out << sum(dr) - sum(st - 1) << "\n";
  }
  return 0;
}