#include <bits/stdc++.h>
using namespace std;
class dc_CHAIN {
private :
struct NODE {
int val;
NODE *pre;
NODE *suc;
};
void conduct_insert(int v,NODE *p) {
NODE *node = new NODE;
node->val = v;
if(p == NULL) {
p = node;
node->pre = node;
node->suc = node;
} else {
node->pre = p;
node->suc = p->suc;
p->suc->pre = node;
p->suc = node;
}
}
void conduct_delete(NODE *p) {
p->pre->suc = p->suc;
p->suc->pre = p->pre;
NODE *tmp = p;
p = p->suc;
delete tmp;
}
public :
void Insert(int v,NODE *p) {
conduct_insert(v,p);
}
void Delete(NODE *p) {
conduct_delete(p);
}
bool find_back(int v,NODE *p) {
NODE *tmp = p;
while(p->val != v&&p != tmp) p = p->suc;
if(tmp == p&&p->val != v)
return false;
return true;
}
void find_front(int v,NODE *p) {
NODE *tmp = p;
while(p->val != v&&p != tmp) p = p->pre;
if(tmp == p&&p->val != v)
return false;
return true;
}
} chain;
signed main() {
}
#include <bits/stdc++.h>
using namespace std;
class SkipList {
private :
template<class K,class E>
struct NODE {
pair<K,E> element;
NODE<K,E>** next;
skipnode(const pair<K,E>& thepair,int levelsize) {
element = thepair;
next = new NODE<K,E>*[levelsize];
}
};
int currentlevel;
int maxlevel;
int size;
double cutoff;
K maxkey;
NODE<K,E>* headernode;
NODE<K,E>* tailnode;
NODE<K,E>** lastnodearray;
int randomlevel() {
int level = 0;
while(rand() < cutoff) ++level;
return min(maxlevel,level);
}
NODE<K,E>* search(const K& thekey) const {
NODE<K,E>* beforenode = headernode;
for(int i = currentlevel;i >= 0;--i) {
while(beforenode->next[i]->element.first < thekey) {
beforenode = beforenode->next[i];
}
lastnodearray[i] = beforenode;
}
return beforenode->next[0];
}
public :
SkipList(K themaxkey, int maxpairs,double prob) {
cutoff = prob*RAND_MAX;
maxlevel = (int)ceil(logf((double)maxpairs)/logf(1.prob))-1;
currentlevel = 0;
size = 0;
maxkey = themaxkey;
pair<K,E> tailpair;
}
};
signed main() {
}
@bikuhiku