Cod sursa(job #1855829)

Utilizator FlowstaticBejan Irina Flowstatic Data 23 ianuarie 2017 23:43:41
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.85 kb
#include <cstdio>
#include <iostream>
#include <limits>
#define FOR(i,a,b) for(int i = a; i <= b; i++)
#define NMAX 200005
using namespace std;

FILE* fin = fopen("heapuri.in","r");
FILE* fout = fopen("heapuri.out","w");

int ent[NMAX],H[NMAX],poz[NMAX];
int N,k;
const int INF = numeric_limits<int>::max();

int Parent(int i);
int Left(int i);
int Right(int i);
int Min(int H[NMAX]);
int ExtractMin(int (&H)[NMAX], int& n);
void HeapDescreaseKey(int (&A)[NMAX],int i, int ord);
void MinHeapInsert(int  (&H)[NMAX], int& n, int ord);
void MinHeapify(int (&H)[NMAX], int& n,int i);
void BuildMinHeap(int (&A)[NMAX], int& n);
void Heapsort(int (&A)[NMAX], int& n);
void Remove(int (&H)[NMAX], int &n, int key);

int main()
{
    int cod, nr,q;
    fscanf(fin,"%d",&q);
    H[0] = -INF;
    FOR(i,1,q)
    {
        fscanf(fin,"%d",&cod);
        if(cod == 1)
        {
            fscanf(fin,"%d",&nr);
            ent[++k] = nr;
            MinHeapInsert(H,N,k);
        }
        else if(cod == 2)
        {
            fscanf(fin,"%d",&nr);
            Remove(H,N,nr);
            //poz[nr] = -1;
        }
        else
        {
             fprintf(fout,"%d\n",ent[H[1]]);
        }
    }
    return 0;
}

int Parent(int i)
{
    return i >> 1;
}

int Left(int i)
{
    return i << 1;
}

int Right(int i)
{
    return (i << 1) + 1;
}


int Min(int H[NMAX])
{
    return H[1];
}

int ExtractMin(int (&H)[NMAX], int& n)
{
    if(n < 1)
    {
        cout<<"Heap underflow";
    }
    int minim = ent[H[1]];
    poz[H[1]] = 0;
    H[1] = H[n--];
    poz[H[1]] = 1;
    MinHeapify(H,n,1);
    return minim;
}

void Remove(int (&H)[NMAX], int &n, int p)
{
    ent[p] = -INF;
    HeapDescreaseKey(H, poz[p], p);

    ExtractMin(H,n);
}

void HeapDescreaseKey(int (&H)[NMAX], int i, int ord)
{
    H[i] = ord;
    poz[ord] = i;

    while(i > 1 && ent[H[Parent(i)]] > ent[H[i]])
    {
        swap(H[i], H[Parent(i)]);
        poz[H[i]] = i;
        poz[H[Parent(i)]] = Parent(i);
        i = Parent(i);
    }

}

void MinHeapInsert(int (&H)[NMAX], int& n, int ord)
{
    n++;
    H[n] = INF;
    poz[ord] = n;
    HeapDescreaseKey(H, n, ord);
}

void MinHeapify(int (&H)[NMAX], int& n,int i) //assumes Left(i) & Right(i) are heaps, but i not quite
{
    int smallest, l = Left(i), r = Right(i);

    if( l <= n && ent[H[l]] < ent[H[i]] )
        smallest = l;
    else
        smallest = i;
    if( r <= n && ent[H[r]] < ent[H[smallest]] )
        smallest = r;

    if( smallest != i )
    {
        swap( H[i], H[smallest] );
        poz[H[i]] = i;
        poz[H[smallest]] = smallest;
        MinHeapify( H, n, smallest );
    }
}
/*
void BuildMinHeap(int (&A)[NMAX], int& n)
{
    for(int i = A[n/2]; i >= 1; i--)
        MinHeapify(A,n,i);
}

void Heapsort(int (&A)[NMAX], int& n)
{
    BuildMinHeap(A,n);
    for( int i = n; i >= 2; i-- )
    {
        swap(A[i],A[i]);
        n--;
        MinHeapify(A,n,1);
    }
}
*/