Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const int LG = 24, MAX = 1000000; // макс. количество битов в представлении, макс. количество нод в боре
- int go[MAX][2]; // аналог std::array
- memset(go, -1, sizeof go); // заполним дефолтными значениями
- int nidx = 1; // первый неиспользованный индекс
- function <void(int)> add = [&](int x) {
- int cur = 0;
- for (int i = LG - 1; i >= 0; --i) {
- int bit = (x >> i) & 1;
- if (go[cur][bit] == -1) go[cur][bit] = nidx++;
- cur = go[cur][bit];
- }
- // здесь можно добавить сохранение какой-то информации, но это не влезет в 2 std::array
- };
- function <int(void)> get_max = [&]() { // необходимо, чтобы в боре было хотя бы одно число
- int res = 0, cur = 0;
- for (int i = LG - 1; i >= 0; --i) {
- if (go[cur][1] == -1) cur = go[cur][0]; // придётся идти в нулевой разряд...
- else {
- res |= (1 << i);
- cur = go[cur][1];
- }
- }
- return res;
- };
- function <int(void)> get_min = [&]() { // необходимо, чтобы в боре было хотя бы одно число
- int res = 0, cur = 0;
- for (int i = LG - 1; i >= 0; --i) {
- if (go[cur][0] == -1) { // придётся идти в единичный разряд...
- res |= (1 << i);
- cur = go[cur][1];
- }
- else cur = go[cur][0];
- }
- return res;
- };
- // затестим
- add(2);
- add(5);
- assert(get_min() == 2 && get_max() == 5);
- add(1 << 23);
- add(0);
- add(7);
- add(2);
- assert(get_min() == 0 && get_max() == 8388608);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement