Cod sursa(job #1714288)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 7 iunie 2016 22:12:28
Problema Schi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <bits/stdc++.h>

using namespace std;

#define FILE_IO

class Treap
{
private:
    struct _treap
    {
        int key, priority, sz;
        _treap *lft, *rgt;

        _treap()
        {
            key = priority = sz = 0;
            lft = rgt = 0;
        }

        _treap(int _key, int _priority, int _sz, _treap *_lft, _treap *_rgt)
        {
            key = _key;
            priority = _priority;
            sz = _sz;
            lft = _lft;
            rgt = _rgt;
        }
    };
    _treap *R, *nil;

    int getRandomPriority()
    {
        int mod = (1 << 30) - 1;
        int priority = (rand() & mod) + 1;
        return priority;
    }

    void updateSize(_treap *&T)
    {
        if(T == nil)    return;
        T -> sz = T -> lft -> sz + 1 + T -> rgt -> sz;
    }

    void Balance(_treap *&T)
    {
        if(T -> priority < T -> lft -> priority)
            rotateLeft(T);
        if(T -> priority < T -> rgt -> priority)
            rotateRight(T);

        updateSize(T -> lft);
        updateSize(T -> rgt);
        updateSize(T);
    }

    void rotateLeft(_treap *&T)
    {
        _treap *_T = T -> lft;
        T -> lft = _T -> rgt;
        _T -> rgt = T;
        T = _T;
    }

    void rotateRight(_treap *&T)
    {
        _treap *_T = T -> rgt;
        T -> rgt = _T -> lft;
        _T -> lft = T;
        T = _T;
    }

    void Insert(_treap *&T, int pos, int key, int priority)
    {
        if(T == nil)
        {
            T = new _treap(key, priority, 1, nil, nil);
            return;
        }

        if(T -> lft -> sz >= pos)
            Insert(T -> lft, pos, key, priority);
        else
            Insert(T -> rgt, pos - T -> lft -> sz - 1, key, priority);

        Balance(T);
    }

    void Print(_treap *&T)
    {
        if(T == nil)    return;
        Print(T -> lft);
        printf("%d\n", T -> key);
        Print(T -> rgt);
    }

public:
    Treap()
    {
        nil = new _treap;
        nil -> lft = nil -> rgt = nil;
        R = nil;
    }

    void Insert(int pos, int val)
    {
        Insert(R, pos - 1, val, getRandomPriority());
    }

    void Print()
    {
        Print(R);
    }
};

Treap trp;

int main()
{
    #ifdef FILE_IO
    freopen("schi.in", "r", stdin);
    freopen("schi.out", "w", stdout);
    #endif

    int N;
    scanf("%d", &N);
    for(int i = 1; i <= N; i++)
    {
        int x;
        scanf("%d", &x);
        trp.Insert(x, i);
    }
    trp.Print();

    return 0;
}