Cod sursa(job #1855463)

Utilizator FlowstaticBejan Irina Flowstatic Data 23 ianuarie 2017 17:54:44
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.76 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];
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 key);
void MinHeapInsert(int  (&H)[NMAX], int& n, int key);
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,nr);
        }
        else if(cod == 2)
        {
            fscanf(fin,"%d",&nr);
            Remove(H,N,ent[nr]);
        }
        else
        {
             fprintf(fout,"%d\n",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 = H[1];
    H[1] = H[n];
    n--;
    MinHeapify(H,n,1);
    return minim;
}

void Remove(int (&H)[NMAX], int &n, int key)
{
    FOR(i,1,n)
    {
        if(H[i] == key)
        {
            HeapDescreaseKey(H,i,-INF);
            ExtractMin(H,n);
            break;
        }
    }
}

void HeapDescreaseKey(int (&A)[NMAX], int i, int key)
{
    if( key > A[i])
    {
        cout<<"new key is bigger than current key";
    }
    A[i] = key;
    while(i > 1 && A[Parent(i)] > A[i])
    {
        swap(A[i], A[Parent(i)]);
        i = Parent(i);
    }
}

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

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 && H[l] < H[i] )
        smallest = l;
    else
        smallest = i;
    if( r <= n && H[r] < H[smallest] )
        smallest = r;

    if( smallest != i )
    {
        swap( H[i], H[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);
    }
}