Cod sursa(job #2324924)

Utilizator daru06Daria Culac daru06 Data 21 ianuarie 2019 18:54:21
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>

using namespace std;

#define dim 100001
/// 2^n, unde n este numarul de 0 in scrierea in baza 2 a lui x
#define p2(x) ((x ^ (x - 1)) & x)

int N, O, T, i, pi;
int Arb[dim];
ifstream fin("aib.in");
ofstream fout("aib.out");

void Adauga(int p, int v) {
    int i;
    for (i = p; i <= N; i += p2(i))
        Arb[i] += v;
}

int Suma(int p) { /// suma pana la pozitia p
  int i, s = 0;
  for (i = p; i > 0; i -= p2(i))
    s += Arb[i];
  return s;
}

int Search(int v) {
  int i, p = pi;
  for (i = 0; p; p >>= 1)
    if (i + p <= N)
      if (Arb[i + p] <= v) {
        i += p, v -= Arb[i];
        if (v == 0)
          return i;
      }
  return -1;
}

int main() {
  int cod, a, b;
  fin >> N >> O;
  for (i = 1; i <= N; i++) {
    fin >> T;
    Adauga(i, T); // Adunam T la 0.
  }
  for (pi = 1; pi < N; pi <<= 1); // pasul initial pentru cautare
  while (O--) {   // operatiile
    fin >> cod; // codul operatiei
    if (cod < 2) {
      fin >> a >> b;
      if (cod == 0)
        Adauga(a, b);
      else
        fout << Suma(b) - Suma(a - 1) << '\n' ;
    }
    else {
      fin >> a;
      fout << Search(a) << '\n';
    }
  }
}