Cod sursa(job #2784155)

Utilizator YusyBossFares Yusuf YusyBoss Data 15 octombrie 2021 22:12:25
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#define NMAX 100000
#define MAXLOG 16

using namespace std;

ifstream cin ("aib.in");
ofstream cout ("aib.out");

int n;
int vaib[NMAX + 1];

static inline int lsb(int val) { /// least significant bit
  return val & (-val);
}

int update(int val, int poz) {
  while (poz <= n) {
    vaib[poz] += val;
    poz += lsb(poz);
  }
}

int query1(int poz) { /// suma dintre (1, n)
  int sol = 0;
  while (poz > 0) {
    sol += vaib[poz];
    poz -= lsb(poz);
  }
  return sol;
}

int query2(int val) {
  int i, sum, pozcur;

  sum = pozcur = 0;
  for (i = MAXLOG; i >= 0 && sum < val; i--) {
    if ((1 << i) + pozcur <= n && sum + vaib[pozcur + (1 << i)] <= val) {
      sum += vaib[pozcur + (1 << i)];
      pozcur += (1 << i);
    }
  }

  if (sum == val)
    return pozcur;
  return -1;
}

int main() {
  int t, x, a, b, i, op;
  cin >> n >> t;

  for (i = 1; i <= n; i++) {
    cin >> x;
    update(x, i);
  }

  for (i = 1; i <= n; i++)
    printf("%d ", vaib[i]);

  while (t--) {
    cin >> op;
    if (op == 0) {
      cin >> a >> b;
      update(b, a);
    }
    else if (op == 1) {
      cin >> a >> b;
      cout << query1(b) - query1(a - 1) << "\n";
    }
    else {
      cin >> a;
      cout << query2(a) << "\n";
    }
  }
  return 0;
}