Cod sursa(job #642482)

Utilizator irene_mFMI Irina Iancu irene_m Data 1 decembrie 2011 15:06:53
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <iostream>

using namespace std;

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( unsigned( time( 0 ) ) );
    R = NIL = new Treap(0, 0, NULL, NULL);

    scanf( "%d", &N );
    for( ; N; N-- ){
        cin >> key;
        insert( R, key, rand() + 1 );
    }

    write( R );

    fclose( stdin );
    fclose( stdout );
    return 0;
}