Pagini recente » Cod sursa (job #1236189) | Cod sursa (job #1143754) | Cod sursa (job #482242) | Cod sursa (job #1523223) | Cod sursa (job #642479)
Cod sursa(job #642479)
#include <cstdio>
#include <cstdlib>
#include <ctime>
struct Treap{
int key, priority;
Treap *left, *right;
Treap() {}
Treap( int key, int priority, Treap *left, Treap *right ){
this -> key = key;
this -> priority = priority;
this -> left = left;
this -> right = right;
}
} *R, *NIL;
const char infile[] = "algsort.in";
const char outfile[] = "algsort.out";
int N, key;
void rotleft(Treap *&T) {
Treap *t = T->left;
T->left = t->right, t->right = T;
T = t;
}
void rotright(Treap *&T) {
Treap *t = T->right;
T->right = t->left, t->left = T;
T = t;
}
void balance( Treap *&T ){
if( T -> left -> priority > T -> priority )
rotleft( T );
else
if( T -> right -> priority >= T -> priority )
rotright( T );
}
void insert( Treap *&T, int key, int priority ){
if( T == NIL ){
T = new Treap( key, priority, NIL, NIL );
return;
}
if( key < T -> key )
insert( T -> left, key, priority );
else
insert( T -> right, key, priority );
balance( T );
}
void write( Treap *T ){
if( T == NIL )
return;
write( T -> left );
printf( "%d ", T -> key );
write( T -> right );
}
int main(){
freopen( infile, "r", stdin );
freopen( outfile, "w", stdout );
srand( time(NULL) );
R = NIL = new Treap(0, 0, NULL, NULL);
scanf( "%d", &N );
for( ; N; N-- ){
scanf( "%d", &key );
insert( R, key, rand() + 1 );
}
write( R );
fclose( stdin );
fclose( stdout );
return 0;
}