Cod sursa(job #2949562)

Utilizator smunteanuMunteanu Stefan Catalin smunteanu Data 30 noiembrie 2022 23:35:21
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
using namespace std;

typedef long long llong;
const int nmax = 1e5 + 7;

static int n, m;
static int a[nmax];
static llong aib[nmax];

void solve() {

  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    aib[i] = a[i];
  }

  for (int i = 1; i <= n; i++) {
    if (i + (i & -i) <= n) aib[i + (i & -i)] += aib[i];
  }

  while (m--) {

    int c;
    cin >> c;
    
    if (c == 0) {
      int a, b;
      cin >> a >> b;
      for (; a <= n; a += a & -a) aib[a] += b;
      continue;
    }

    if (c == 1) {
      int a, b;
      cin >> a >> b;
      llong s = 0;
      for (int p = b; p; p -= p & -p) s += aib[p];
      for (int p = a - 1; p; p -= p & -p) s -= aib[p];
      cout << s << '\n';
      continue;
    }

    if (c == 2) {
      int a;
      cin >> a;
      int p = 1;
      int s = aib[1];
      // while (s < a) {
      //   int q = p + (p & -p);
      //   // if (aib[q] > a) p++;
      //   // else s += aib[q] - aib[p], p = q;
      // }
      cout << p << '\n';
      continue;
    }
  }
  
}

int main() {

  #ifdef LOCAL
  freopen("file.in", "r", stdin);
  #else
  freopen("aib.in", "r", stdin);
  freopen("aib.out", "w", stdout);
  #endif

  ios_base::sync_with_stdio(false), cin.tie(NULL);

  solve();

}