Cod sursa(job #2522607)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 12 ianuarie 2020 18:40:43
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 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 a, int b)
  {
    return query(b) - query(a - 1);
  }
  int smallest(int value)
  {
    int li = 1; int 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:
  int size_;
  vector<int> data_;
};


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

  int N, M;
  scanf("%d%d", &N, &M);
  AIB FenwickTree(N);
  for (int i = 1; i <= N; ++i) {
    int x;
    scanf("%d", &x);
    FenwickTree.add(i, x);
  }

  for (int i = 1; i <= M; ++i) {
    int op;
    scanf("%d", &op);
    if (op == 0) {
      int pos, val;
      scanf("%d%d", &pos, &val);
      FenwickTree.add(pos, val);
      continue;
    }
    if (op == 1) {
      int left, right;
      scanf("%d%d", &left, &right);
      printf("%d\n", FenwickTree.queryInterval(left, right));
      continue;
    }
    int val;
    scanf("%d", &val);
    printf("%d\n", FenwickTree.smallest(val));
  }
  
  return 0;
}