Cod sursa(job #1587445)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 2 februarie 2016 01:14:30
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.32 kb
#include <stdio.h>
#include <fstream>
#include <algorithm>

using namespace std;

const int NMAX = 200001;
struct node{int key,_rank;};
typedef node Heap[NMAX];
typedef int Rank_Pos[NMAX];

inline int father(int k)
{
    return  k/2;
}

inline int left_son(int k)
{
    return 2*k;
}

inline int right_son(int k)
{
    return 2*k+1;
}

inline int minim(Heap H)
{
    return H[1].key;
}

void sift(Heap H,int n,int k,Rank_Pos pr)
{
    int son;
    do
    {
        son = 0;
        if(left_son(k)<=n)
        {
            son = left_son(k);
            if((right_son(k)<=n) && (H[left_son(k)].key > H[right_son(k)].key))
                son = right_son(k);
            if(H[son].key >= H[k].key)
            son = 0;
        }
        if(son)
        {
        int order = pr[H[son]._rank];
        pr[H[son]._rank] = pr[H[k]._rank];
        pr[H[k]._rank] = order;
        swap(H[k],H[son]);
            k = son;
        }

    }while(son);
}

void percolate(Heap H,int n,int k,Rank_Pos pr)
{
    node aux = H[k];
    while(k>1 && H[father(k)].key > aux.key)
    {
        int order = pr[aux._rank];
        pr[aux._rank] = pr[H[father(k)]._rank];
        pr[H[father(k)]._rank] = order;
        H[k] = H[father(k)];
        k = father(k);
    }
    H[k] = aux;
}

void _insert(Heap H,int &n,int key,int _rank,Rank_Pos pr)
{
    H[++n].key = key;
    H[n]._rank = _rank;
    pr[_rank] = n;
    percolate(H,n,n,pr);
}

void cut(Heap H,int &n,int k,Rank_Pos pr)
{
    pr[H[k]._rank] = 0;
    H[k] = H[n];
    pr[H[k]._rank] = k;
    n--;
    if(k > 1 && H[k].key < H[father(k)].key)
    percolate(H,n,k,pr);
    else
    sift(H,n,k,pr);
}

Heap H;
Rank_Pos pr;
int _size = 0;
int _rank = 0;

int main()
{
    int n;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    int type,value;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&type);
        if(type!=3)
        scanf("%d",&value);
       if(type==1)
        _insert(H,_size,value,++_rank,pr);
        else
            if(type==2)
        {
            int r = pr[value];
            if(r!=0)
                cut(H,_size,r,pr);
        }
        else
           printf("%d\n",minim(H));
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}