Cod sursa(job #2756811)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 2 iunie 2021 22:49:06
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <vector>

using namespace std;

class AIB{
public:
  AIB(int size): size_(size + 1), data_(size + 1) {}
  void add(int pos, int value) {
    for (int i = pos; i < size_; i += i & (-i))
      data_[i] += value;
  }
  int query(int pos) {
    int answer = 0;
    for (int i = pos; i > 0; i -= i & (-i))
      answer += data_[i];
    return answer;
  }
  int queryInterval(int left, int right) {
    return query(right) - query(left - 1);
  }
  int smallest(int value) {
    int li = 1, lf = size_ - 1;
    while (li <= lf) {
      int m = li + (lf - li) / 2;
      int ans = query(m);
      if (ans >= value)
	lf = m - 1;
      else
	li = m + 1;
    }
    if (query(li) == value)
      return li;
    return -1;
  }

private:
  vector<int> data_;
  int size_;
};

int main()
{
  freopen("aib.in", "r", stdin);
  freopen("aib.out", "w", stdout);

  int N, M;
  scanf("%d%d", &N, &M);
  AIB aib(N);
  for (int i = 1; i <= N; ++i) {
    int x;
    scanf("%d", &x);
    aib.add(i, x);
  }
  for (int i = 0; i < M; ++i) {
    int op, a, b;
    scanf("%d", &op);
    if (op == 0) {
      scanf("%d%d", &a, &b);
      aib.add(a, b);
      continue;
    }
    if (op == 1) {
      scanf("%d%d", &a, &b);
      printf("%d\n", aib.queryInterval(a, b));
      continue;
    }
    scanf("%d", &b);
    printf("%d\n", aib.smallest(b));
    
  }
  
  
  return 0;
}