Cod sursa(job #1291227)

Utilizator tibi9876Marin Tiberiu tibi9876 Data 12 decembrie 2014 15:48:14
Problema Schi Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;

struct T
{
    short key,priority,d;
    T *left,*right;
    T() {};
    T(short key,short priority,short d,T *left,T *right)
    {
        this->key=key;
        this->priority=priority;
        this->d=d;
        this->left=left;
        this->right=right;
    }
} *nil,*R;

void act(T* &n)
{
    short x=1;
    if (n==nil)
        x--;
    if (n->left!=NULL)
        x+=n->left->d;
    if (n->right!=NULL)
        x+=n->right->d;
    n->d=x;
}

void rotleft(T* &n) {
    T *t = n->right;
    n->right = t->left;
    t->left = n;
    n = t;
    act(n->left);
    act(n->right);
    act(n);
}

void rotright(T* &n) {
    T *t = n->left;
    n->left = t->right; t->right = n;
    n = t;
    act(n->left);
    act(n->right);
    act(n);
}

void balance(T* &n) {
    if (n->left->priority > n->priority)
        rotright(n);
    else if (n->right->priority > n->priority)
        rotleft(n);
    act(n);
}

void insert(T* &n, short key, short priority,short x) {
    if (n == nil) {
        n = new T(key, priority,1, nil, nil);
        return;
    }
    if (x<=n->left->d)
        insert(n->left, key, priority,x);
    else
        insert(n->right, key, priority,x-1-n->left->d);

    balance(n);
}

ifstream f("schi.in");
ofstream g("schi.out");

void df(T* &n)
{
    if (n==nil)
        return;
    df(n->left);
    g << n->key << "\n";
    df(n->right);
}

short i,n,x;

int main()
{
    srand(time(NULL));
    nil=new T(0,0,0,NULL,NULL);
    R=new T(1,rand()+1,1,nil,nil);
    f >> n;
    f >> x;
    for (i=2;i<=n;i++)
    {
        f >> x;
        insert(R,i,rand()%30000+1,x-1);
    }
    df(R);
}