Cod sursa(job #2408893)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 18 aprilie 2019 14:05:38
Problema Order Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.42 kb
#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;
}