#include <bits/stdc++.h>
using
namespace
std;
class
Proto_Van_Emde_Boas {
public
:
int
universe_size;
Proto_Van_Emde_Boas* summary;
vector<Proto_Van_Emde_Boas*> clusters;
int
root(
int
u)
{
return
(
int
)
sqrt
(u);
}
int
high(
int
x)
{
return
x / root(universe_size);
}
int
low(
int
x)
{
return
x % root(universe_size);
}
int
generate_index(
int
cluster,
int
position)
{
return
cluster * root(universe_size) + position;
}
Proto_Van_Emde_Boas(
int
size)
{
universe_size = size;
if
(size <= 2) {
summary = nullptr;
clusters = vector<Proto_Van_Emde_Boas*>(size, nullptr);
}
else
{
summary =
new
Proto_Van_Emde_Boas(root(size));
clusters = vector<Proto_Van_Emde_Boas*>(root(size), nullptr);
for
(
int
i = 0; i < root(size); i++) {
clusters[i] =
new
Proto_Van_Emde_Boas(root(size));
}
}
}
};
bool
isMember(Proto_Van_Emde_Boas* helper,
int
key)
{
if
(key >= helper->universe_size)
return
false
;
if
(helper->universe_size == 2) {
return
helper->clusters[key];
}
else
{
return
isMember(helper->clusters[helper->high(key)],
helper->low(key));
}
}
void
insert(Proto_Van_Emde_Boas*& helper,
int
key)
{
if
(helper->universe_size == 2) {
helper->clusters[key] =
new
Proto_Van_Emde_Boas(1);
}
else
{
insert(helper->clusters[helper->high(key)],
helper->low(key));
insert(helper->summary, helper->high(key));
}
}
int
minimum(Proto_Van_Emde_Boas* helper)
{
if
(helper->universe_size == 2) {
if
(helper->clusters[0]) {
return
0;
}
else
if
(helper->clusters[1]) {
return
1;
}
return
-1;
}
else
{
int
minimum_cluster = minimum(helper->summary);
int
offset;
if
(minimum_cluster == -1) {
return
-1;
}
else
{
offset = minimum(helper->clusters[minimum_cluster]);
return
helper->generate_index(minimum_cluster, offset);
}
}
}
int
maximum(Proto_Van_Emde_Boas* helper)
{
if
(helper->universe_size == 2) {
if
(helper->clusters[1]) {
return
1;
}
else
if
(helper->clusters[0]) {
return
0;
}
return
-1;
}
else
{
int
maximum_cluster = maximum(helper->summary);
int
offset;
if
(maximum_cluster == -1) {
return
-1;
}
else
{
offset = maximum(helper->clusters[maximum_cluster]);
return
helper->generate_index(maximum_cluster, offset);
}
}
}
int
successor(Proto_Van_Emde_Boas* helper,
int
key)
{
if
(helper->universe_size == 2) {
if
(key == 0 && helper->clusters[1])
return
1;
else
return
-1;
}
else
{
int
offset = successor(helper->clusters[helper->high(key)],
helper->low(key));
if
(offset != -1)
return
helper->generate_index(helper->high(key), offset);
else
{
int
successor_cluster = successor(helper->summary,
helper->high(key));
if
(successor_cluster == -1)
return
-1;
else
{
offset = minimum(helper->clusters[successor_cluster]);
return
helper->generate_index(successor_cluster, offset);
}
}
}
}
int
predecessor(Proto_Van_Emde_Boas* helper,
int
key)
{
if
(helper->universe_size == 2) {
if
(key == 1 && helper->clusters[0])
return
0;
else
return
-1;
}
else
{
int
offset = predecessor(helper->clusters[helper->high(key)],
helper->low(key));
if
(offset != -1)
return
helper->generate_index(helper->high(key), offset);
else
{
int
predecessor_cluster = predecessor(helper->summary,
helper->high(key));
if
(predecessor_cluster == -1)
return
-1;
else
{
offset = maximum(helper->clusters[predecessor_cluster]);
return
helper->generate_index(predecessor_cluster, offset);
}
}
}
}
void
pveb_delete(Proto_Van_Emde_Boas*& helper,
int
key)
{
if
(helper->universe_size == 2) {
if
(helper->clusters[key]) {
delete
helper->clusters[key];
helper->clusters[key] = nullptr;
}
}
else
{
pveb_delete(helper->clusters[helper->high(key)], helper->low(key));
bool
isanyinCluster =
false
;
for
(
int
i = helper->high(key) * helper->root(helper->universe_size);
i < (helper->high(key) + 1) * helper->root(helper->universe_size);
i++) {
if
(isMember(helper->clusters[helper->high(key)], i)) {
isanyinCluster =
true
;
break
;
}
}
if
(isanyinCluster ==
false
) {
pveb_delete(helper->summary, helper->high(key));
}
}
}
int
main()
{
Proto_Van_Emde_Boas* hello =
new
Proto_Van_Emde_Boas(16);
cout << boolalpha;
insert(hello, 2);
insert(hello, 13);
insert(hello, 3);
cout << successor(hello, 3) << endl;
cout << predecessor(hello, 13) << endl;
}