Cod sursa(job #1693399)

Utilizator stoianmihailStoian Mihail stoianmihail Data 22 aprilie 2016 23:45:52
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <bits/stdc++.h>

class bit {
private:
  int inside, aibSize;
  std::vector <int> aib;

public:
  bit(int N) {
    this -> inside = 0;
    this -> aibSize = 1;

    if (N & (N - 1)) {
      while (this -> aibSize <= N) {
        this -> aibSize <<= 1;
      }
    } else {
      this -> aibSize = N;
    }
    this -> aib.resize(this -> aibSize + 1);
  }

private:
  void add(int x, int val) {
    assert(x);
    this -> inside += val;
    do {
      this -> aib[x] += val;
      x += x & -x;
    } while (x <= this -> aibSize);
  }

  int sum(int x) {
    int s = 0;

    while (x) {
      s += this -> aib[x];
      x &= x - 1;
    }
    return s;
  }

  int bSearch(int val) {
    int interval = this -> aibSize >> 1, x = 0;

    while (interval) {
      if (this -> aib[x + interval] < val) {
        val -= this -> aib[x += interval];
      }
      interval >>= 1;
    }
    return x + 1;
  }

public:
  int size() {
    return this -> inside;
  }

  int empty() {
    return this -> inside == 0;
  }

  void insert(int x) {
    this -> add(x, +1);
  }

  void erase(int x) {
    if (!this -> empty()) {
      this -> add(x, -1);
    } else {
      assert(0);
    }
  }

  int begin() {
    if (!this -> empty()) {
      return this -> bSearch(1);
    } else {
      assert(0);
    }
  }

  int end() {
    if (!this -> empty()) {
      return this -> bSearch(inside);
    } else {
      assert(0);
    }
  }

  int nth_element(int x) {
    if (this -> size() >= x) {
      if (x == 0) {
        assert(0);
      } else {
        return this -> bSearch(x);
      }
    } else {
      assert(0);
    }
  }

  int lower_bound(int x) {
    return this -> sum(x);
  }
};

int main(void) {
  FILE *f = fopen("1.in", "r");

  bit aib(10);

  assert(aib.empty());
  aib.insert(3);
  aib.insert(7);
  aib.insert(10);
  aib.insert(11);
  fprintf(stderr, "minimul = %d\n", aib.begin());
  //aib.erase(10);
  //aib.erase(10);
  //fprintf(stderr, "%d\n",aib.aibSize);
  //fprintf(stderr, "marime = %d\n", aib.size());
  fprintf(stderr, "ala = %d\n", aib.lower_bound(4));

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}