Pagini recente » Cod sursa (job #2922344) | Cod sursa (job #3217526) | Cod sursa (job #1471029) | Cod sursa (job #1884585) | Cod sursa (job #1693399)
#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;
}