Pagini recente » Cod sursa (job #2577572) | Cod sursa (job #1747208) | Cod sursa (job #389533) | Cod sursa (job #2030260) | Cod sursa (job #2392172)
#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;
}