Cod sursa(job #1587262)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 1 februarie 2016 21:35:38
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <stdio.h>
#include <fstream>
#include <algorithm>

using namespace std;

const int NMAX = 200001;
struct node{int key,_rank;};
typedef node Heap[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)
{
    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)
        {
            swap(H[k],H[son]);
            k = son;
        }

    }while(son);
}

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

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

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

int _search(Heap H,int n, int _rank)
{
    for(int i=1;i<=n;i++)
        if(H[i]._rank==_rank)
        return i;
    return -1;
}

Heap H;
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);
        else
            if(type==2)
        {
            int r = _search(H,_size,value);
            if(r!=-1)
                cut(H,_size,r);
        }
        else
           printf("%d\n",minim(H));
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}