#include <bits/stdc++.h>
using
namespace
std;
class
Van_Emde_Boas {
public
:
int
universe_size;
int
minimum;
int
maximum;
Van_Emde_Boas* summary;
vector<Van_Emde_Boas*> clusters;
int
high(
int
x)
{
int
div
=
ceil
(
sqrt
(universe_size));
return
x /
div
;
}
int
low(
int
x)
{
int
mod =
ceil
(
sqrt
(universe_size));
return
x % mod;
}
int
generate_index(
int
x,
int
y)
{
int
ru =
ceil
(
sqrt
(universe_size));
return
x * ru + y;
}
Van_Emde_Boas(
int
size)
{
universe_size = size;
minimum = -1;
maximum = -1;
if
(size <= 2) {
summary = nullptr;
clusters = vector<Van_Emde_Boas*>(0, nullptr);
}
else
{
int
no_clusters =
ceil
(
sqrt
(size));
summary =
new
Van_Emde_Boas(no_clusters);
clusters = vector<Van_Emde_Boas*>(no_clusters, nullptr);
for
(
int
i = 0; i < no_clusters; i++) {
clusters[i] =
new
Van_Emde_Boas(
ceil
(
sqrt
(size)));
}
}
}
};
int
VEB_minimum(Van_Emde_Boas* helper)
{
return
(helper->minimum == -1 ? -1 : helper->minimum);
}
int
VEB_maximum(Van_Emde_Boas* helper)
{
return
(helper->maximum == -1 ? -1 : helper->maximum);
}
void
insert(Van_Emde_Boas* helper,
int
key)
{
if
(helper->minimum == -1) {
helper->minimum = key;
helper->maximum = key;
}
else
{
if
(key < helper->minimum) {
swap(helper->minimum, key);
}
if
(helper->universe_size > 2) {
if
(VEB_minimum(helper->clusters[helper->high(key)]) == -1) {
insert(helper->summary, helper->high(key));
helper->clusters[helper->high(key)]->minimum = helper->low(key);
helper->clusters[helper->high(key)]->maximum = helper->low(key);
}
else
{
insert(helper->clusters[helper->high(key)], helper->low(key));
}
}
if
(key > helper->maximum) {
helper->maximum = key;
}
}
}
bool
isMember(Van_Emde_Boas* helper,
int
key)
{
if
(helper->universe_size < key) {
return
false
;
}
if
(helper->minimum == key || helper->maximum == key) {
return
true
;
}
else
{
if
(helper->universe_size == 2) {
return
false
;
}
else
{
return
isMember(helper->clusters[helper->high(key)],
helper->low(key));
}
}
}
int
VEB_successor(Van_Emde_Boas* helper,
int
key)
{
if
(helper->universe_size == 2) {
if
(key == 0 && helper->maximum == 1) {
return
1;
}
else
{
return
-1;
}
}
else
if
(helper->minimum != -1 && key < helper->minimum) {
return
helper->minimum;
}
else
{
int
max_incluster = VEB_maximum(helper->clusters[helper->high(key)]);
int
offset{ 0 }, succ_cluster{ 0 };
if
(max_incluster != -1 && helper->low(key) < max_incluster) {
offset = VEB_successor(helper->clusters[helper->high(key)],
helper->low(key));
return
helper->generate_index(helper->high(key), offset);
}
else
{
succ_cluster = VEB_successor(helper->summary, helper->high(key));
if
(succ_cluster == -1) {
return
-1;
}
else
{
offset = VEB_minimum(helper->clusters[succ_cluster]);
return
helper->generate_index(succ_cluster, offset);
}
}
}
}
int
VEB_predecessor(Van_Emde_Boas* helper,
int
key)
{
if
(helper->universe_size == 2) {
if
(key == 1 && helper->minimum == 0) {
return
0;
}
else
return
-1;
}
else
if
(helper->maximum != -1 && key > helper->maximum) {
return
helper->maximum;
}
else
{
int
min_incluster = VEB_minimum(helper->clusters[helper->high(key)]);
int
offset{ 0 }, pred_cluster{ 0 };
if
(min_incluster != -1 && helper->low(key) > min_incluster) {
offset = VEB_predecessor(helper->clusters[helper->high(key)],
helper->low(key));
return
helper->generate_index(helper->high(key), offset);
}
else
{
pred_cluster = VEB_predecessor(helper->summary, helper->high(key));
if
(pred_cluster == -1) {
if
(helper->minimum != -1 && key > helper->minimum) {
return
helper->minimum;
}
else
return
-1;
}
else
{
offset = VEB_maximum(helper->clusters[pred_cluster]);
return
helper->generate_index(pred_cluster, offset);
}
}
}
}
int
main()
{
Van_Emde_Boas* veb =
new
Van_Emde_Boas(8);
insert(veb, 2);
insert(veb, 3);
insert(veb, 4);
insert(veb, 6);
cout << VEB_successor(veb, 2) << endl;
cout << VEB_predecessor(veb, 6) << endl;
cout << VEB_successor(veb, 4) << endl;
return
0;
}