Cod sursa(job #1204592)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 3 iulie 2014 13:32:54
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.52 kb
#include <cstdio>
#include <cmath>
#include <time.h>
#include <cstdlib>

using namespace std;

class Treap{
public:
    int value,priority;
    Treap *st,*dr;
    Treap(){
        value = priority = 0;
        st = dr = 0;
    }
    Treap(int value,int priority,Treap *st, Treap *dr){
        this->value = value;
        this->priority = priority;
        this->st = st;
        this->dr = dr;
    }
};
Treap *root,*nil;

void Rotate_left(Treap *&T)
{
    Treap *aux = T->st;
    T->st = aux->dr;
    aux->dr = T;
    T = aux;
}
void Rotate_right(Treap *&T)
{
    Treap *aux = T->dr;
    T->dr = aux->st;
    aux->st = T;
    T = aux;
}
void Balance(Treap *&T)
{
    if(T->st->priority > T->priority)
        Rotate_left(T);
    else
        if(T->dr->priority > T->priority)
            Rotate_right(T);
}
void Insert(int value,int priority,Treap *&T)
{
    if(T == nil){
        T = new Treap(value,priority,nil,nil);
        return;
    }
    if(T->value > value)
        Insert(value,priority,T->st);
    else
        Insert(value,priority,T->dr);
    Balance(T);
}
void Delete(int value,Treap *&T)
{
    if(T == nil) return;
    if(T->value > value)
        Delete(value,T->st);
    else
        Delete(value,T->dr);
    if(T->st == nil && T->dr == nil)
        delete T, T = nil;
    else
    {
        if(T->st->priority > T->dr->priority)
            Rotate_left(T);
        else
            Rotate_right(T);
        Delete(value,T);
    }
}
int Search(int value,Treap *&T)
{
    if(T == nil) return 0;
    if(T->value == value) return 1;
    if(T->value > value)
        return Search(value,T->st);
    return Search(value,T->dr);
}
void Split(int value,Treap *&T,Treap *&Tmic,Treap *&Tmare)
{
    Insert(value,2*(0x3f3f3f3f),T);
    Tmic = T->st;
    Tmare = T->dr;
    delete T;
}
void Join(int value,Treap *&T,Treap *&Tmic, Treap *&Tmare)
{
    Treap *aux = new Treap(value,0,Tmic,Tmare);
    Delete(aux->value,aux);
    delete Tmic;
    delete Tmare;
}

Treap Tm,TM;

void Init(Treap *&T){
    T = nil = new Treap(0,0,NULL,NULL);
    srand(unsigned(time(0)));
}
void Sort(Treap *T)
{
    if(T == nil) return;
    Sort(T->st);
    printf("%d ",T->value);
    Sort(T->dr);
}

int main()
{
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    int N,x;
    scanf("%d",&N);
    Init(root);
    for(int i = 1; i <= N; ++i){
        scanf("%d",&x);
        Insert(x,rand()+1,root);
    }
    Sort(root);

    return 0;
}