Cod sursa(job #2392172)

Utilizator Mihai_PredaPreda Mihai Dragos Mihai_Preda Data 29 martie 2019 19:01:41
Problema Sortare prin comparare Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.15 kb
#include <iostream>
#include <fstream>
#include <ctime>
#include <random>

using namespace std;

struct nod
{
    int val, priority;
    nod *fiuSt, *fiuDr;
};

class Treap
{
public:
    Treap()
    {
        root = nullptr;
        srand(time(0));
    }
    void Insert(int val)
    {
        root = Insert(root, val);
    }
    void GetOrder(vector<int> &ret)
    {
        DFS(root, ret);
    }
private:
    void DFS(nod *current, vector<int> &ret)
    {
        if(current == nullptr)
            return;
        DFS(current->fiuSt, ret);
        ret.push_back(current->val);
        DFS(current->fiuDr, ret);
    }
    nod *Insert(nod * current, int val)
    {
        if(current == nullptr)
        {
            current = new nod;
            current->val = val;
            current->priority = rand();
            current->fiuSt = current->fiuDr = nullptr;
            return current;
        }
        if(val <= current->val)
        {
            current->fiuSt = Insert(current->fiuSt, val);

            if(current->fiuSt->priority > current->priority)
                current = RotateRight(current);
        }
        else
        {
            current->fiuDr = Insert(current->fiuDr, val);

            if(current->fiuDr->priority > current->priority)
                current = RotateLeft(current);
        }
        return current;
    }
    nod *RotateRight(nod *current)
    {
        nod *x = current->fiuSt, *y = x->fiuDr;

        x->fiuDr = current;
        current->fiuSt = y;

        return x;
    }
    nod *RotateLeft(nod *current)
    {
        nod *x = current->fiuDr, *y = x->fiuSt;

        x->fiuSt = current;
        current->fiuDr = y;

        return x;
    }
    nod * root;
};

int main()
{
    ifstream in("algsort.in");
    int n;
    in >> n;
    Treap treap;
    int x;
    for(int i = 0; i < n; ++i)
    {
        in >> x;
        treap.Insert(x);
    }
    in.close();
    vector<int> v;
    treap.GetOrder(v);

    ofstream out("algsort.out");
    cout << v.size() << "\n";
    for(auto x:v)
        out << x << " ";
    out.close();
    return 0;
}