Cod sursa(job #2976227)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 8 februarie 2023 18:03:14
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <cstdio>
#include <memory>
#include <vector>

using namespace std;

class FenwickTree{
private:
  int treeSize;
  int maxPow2;
  vector<int> data;
public:
  FenwickTree(int size) {
    treeSize = size + 1;
    data.resize(treeSize);
    maxPow2 = 1;
    while ((maxPow2 << 1) < treeSize)
      maxPow2 <<= 1;
  }
  void add(int position, int value) {
    for (int i = position; i < treeSize; i += (i&(-i)))
      data[i] += value;
  }
  int query(int position) {
    int val = 0;
    for (int i = position; i > 0; i -= (i&(-i)))
      val += data[i];
    return val;
  }
  int queryInterval(int left, int right) {
      return query(right) - query(left - 1);
  }
  int querySmallest(int value) {
    int position = 0;
    int crt = maxPow2;
    while (crt) {
      if (position + crt < treeSize && data[position + crt] <= value) {
	value -= data[position + crt];
	position += crt;
      }
      crt >>=1;
    }
    if (value) // weren't able to match
      return -1;
    return position;
  }
  void printFenwick() {
    for (auto it: data)
      printf("%d ", it);
    printf("\n");
  }
};

class Solver{
private:
public:
  Solver() {
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
  }
  ~Solver() {
    fclose(stdin);
    fclose(stdout);
  }
  void execute() {
    int N, M;
    scanf("%d%d", &N, &M);

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

    int op,  position, left, right;
    for (int i = 1; i <= M; ++i) {
      scanf("%d", &op);
      if (op == 0) {
	scanf("%d%d", &position, &value);
	fenwickTree.add(position, value);
	continue;
      }
      if (op == 1) {
	scanf("%d%d", &left, &right);
	printf("%d\n", fenwickTree.queryInterval(left, right));
	continue;
      }
      //fenwickTree.printFenwick();
      scanf("%d", &value);
      printf("%d\n", fenwickTree.querySmallest(value));
    }
    
  }
};

int main() {
  unique_ptr<Solver> s = make_unique<Solver>();
  s->execute();
  return 0;
}