Cod sursa(job #3312547)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 29 septembrie 2025 03:13:42
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
using namespace std;

struct FenTree {
  int n;
  vector<int> arr;

  FenTree(int n_) : n(n_), arr(n + 1, 0) {}

  void put(int i, int x) {
    for (; i <= n; i += i & -i) {
      arr[i] += x;
    }
  }

  int get(int i) {
    int x = 0;
    for (; i > 0; i -= i & -i) {
      x += arr[i];
    }
    return x;
  }

  int src(int X) {
    int i = 0;
    int x = 0;
    for (int p = std::bit_floor((uint32_t)n); p; p >>= 1) {
      if (i + p <= n && x + arr[i + p] < X) {
        x += arr[i += p];
      }
    }
    ++i;
    if (i > n || get(i) != X) {
      return -1;
    }
    return i;
  }
};

int main() {
#ifndef LOCAL
  freopen("aib.in", "r", stdin);
  freopen("aib.out", "w", stdout);
#endif
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int N;
  int M;
  scanf("%d %d", &N, &M);
  vector<int> arr(N + 1);
  for (int i = 1; i <= N; ++i) {
    scanf("%d", &arr[i]);
  }
  FenTree T(N);
  for (int i = 1; i <= N; ++i) {
    T.put(i, arr[i]);
  }
  for (; M--;) {
    int o;
    scanf("%d", &o);
    if (o == 2) {
      int X;
      scanf("%d", &X);
      printf("%d\n", T.src(X));
    } else {
      int a;
      int b;
      scanf("%d %d", &a, &b);
      if (o == 1) {
        printf("%d\n", T.get(b) - T.get(a - 1));
      } else {
        T.put(a, b);
      }
    }
  }
  return 0;
}