Pagini recente » Cod sursa (job #1101776) | Istoria paginii runda/cerculdeinfo-lectiile9_10_11_12_13/clasament | Cod sursa (job #823595) | Cod sursa (job #809288) | Cod sursa (job #2408893)
#include <cstdio>
#include <stdlib.h>
#include <time.h>
using namespace std;
FILE *fin=fopen ("order.in","r");
FILE *fout=fopen ("order.out","w");
struct treap{
int key,pri,sub;
treap *st,*dr;
treap (int key,int pri,treap *st,treap*dr,int sub){
this->key=key;
this->pri=pri;
this->st=st;
this->dr=dr;
this->sub=sub;
}
};
treap *r,*nil;
void update (treap *&n){
n->sub = (n->st->sub + n->dr->sub + 1);
}
void left (treap *&n){
treap *y = n->st;
n->st = y->dr;
y->dr=n;
n=y;
update (n->dr);
update (n);
}
void right (treap *&n){
treap *y = n->dr;
n->dr = y->st;
y->st=n;
n=y;
update (n->st);
update (n);
}
void balance (treap*&n){
if (n->pri < n->st->pri) /// rotire stanga
left (n);
else if (n->pri < n->dr->pri) /// rotire dreapta
right(n);
}
void inser (treap *&n,int key,int pri){
if (n==nil){ /// e mom sa il adaug?
n = new treap (key,pri,nil,nil,1);
return;
}
else {
if (key < n->key)
inser (n->st, key,pri);
else
inser (n->dr,key,pri);
}
balance (n);
if (n!=nil)
update (n); /// update valorile lui n ???
}
void eras (treap *&n,int poz){
if (n==nil)
return;
if (poz <= n->st->sub)
eras (n->st, poz);
else if (poz > n->st->sub + 1)
eras (n->dr,poz - n->st->sub - 1);
else { /// l am gasit, il mut in jos pana e frunza
if (n->st == nil && n->dr == nil){ /// e frunza
fprintf (fout,"%d ",n->key);
delete n;
n=nil;
}
else { /// erase ca la heap
if (n->st->pri > n->dr->pri)
left(n);
else right(n);
eras (n,poz);
}
}
if (n!=nil)
update (n); /// update valorile lui n
}
int main()
{
int n,i,tot=0,pa;
srand(time(0));
fscanf (fin,"%d",&n);
r=nil=new treap(0,0,NULL,NULL,0);
for (i=1;i<=n;i++){
inser (r,i,rand()+1); /// insert nodul
tot++;
}
pa=2;
for (i=1;i<=n;i++){
eras (r,pa);
if (i!=n){
pa--;
tot--;
if (pa==0)
pa=tot;
pa = (pa + (i+1)) %tot;
if (pa==0)
pa=tot;
}
}
return 0;
}