Nu aveti permisiuni pentru a descarca fisierul grader_test10.ok
Cod sursa(job #1291231)
Utilizator | Data | 12 decembrie 2014 15:51:24 | |
---|---|---|---|
Problema | Schi | Scor | 85 |
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);
}