/**
* Author: Sergey Kopeliovich (Burunduk30@gmail.com)
* Date: 2015.02.15
*/
/** Template */
#include <bits/stdc++.h>
using namespace std;
#define forn(i, n) for (int i = 0; i < (int)(n); i++)
const int MAX_MEM = (int)1e5;
int mpos;
char mem[MAX_MEM];
inline void * operator new ( size_t n ) {
char *res = mem + mpos;
mpos += n;
assert(mpos <= MAX_MEM);
return (void *)res;
}
inline void operator delete ( void * ) { }
inline void * operator new [] ( size_t ) { assert(0); }
inline void operator delete [] ( void * ) { assert(0); }
/** Main part */
struct node {
static node *null;
int x, h;
node *l, *r;
void calc() { h = 1 + max(l->h, r->h); }
node() { l = r = this, h = 0, x = 0; }
node( int x, node* l = null, node* r = null ) : x(x), l(l), r(r) { calc(); }
};
node* node::null = new node();
node* rot_left( node* t ) { // (t->l, t)
return new node(t->l->x, t->l->l, new node(t->x, t->l->r, t->r));
}
node* rot_right( node* t ) { // (t, t->r)
return new node(t->r->x, new node(t->x, t->l, t->r->l), t->r->r);
}
void add( node* &t, int x ) {
if (t == node::null) {
t = new node(x);
return;
}
if (x < t->x) {
add(t->l, x);
if (t->l->h > t->r->h + 1) {
if (t->l->r->h > t->l->l->h)
t->l = rot_right(t->l);
t = rot_left(t);
}
} else {
add(t->r, x);
if (t->r->h > t->l->h + 1) {
if (t->r->l->h > t->r->r->h)
t->r = rot_left(t->r);
t = rot_right(t);
}
}
t->calc();
}
void add_slow( node* &t, int x ) {
if (t == node::null) {
t = new node(x);
return;
}
if (x < t->x) {
add_slow(t->l, x);
if (t->l->h > t->r->h + 1)
t = rot_left(t);
} else {
add_slow(t->r, x);
if (t->r->h > t->l->h + 1)
t = rot_right(t);
}
t->calc();
}
int main() {
int T = 1e6;
for (int N = 5; N <= 25; N++) {
int ma = 0, p[N];
forn(i, N)
p[i] = i;
forn(_, T) {
mpos = 0;
node *a = node::null;
node *b = node::null;
random_shuffle(p, p + N);
forn(i, N) {
add(b, p[i]);
add_slow(a, p[i]);
}
ma = max(ma, a->h - b->h);
}
printf("n = %2d : max diff = %d\n", N, ma);
}
return 0;
}