Cod sursa(job #1741629)

Utilizator KronSabau Valeriu Kron Data 14 august 2016 15:45:12
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <iostream>
#include <fstream>
using namespace std;

int heap[200001],numar[200001],pos[200001],nr;

ifstream f("heapuri.in");
ofstream g("heapuri.out");



void Swap(int x,int y)
{
    swap(heap[x],heap[y]);
    pos[numar[x]]=y;
    pos[numar[y]]=x;
    swap(numar[x],numar[y]);
}

void check_sib(int i,int n)
{
    if(i==1)
        return;
    if(i%2==1 && heap[i]<heap[i-1])
        Swap(i,i-1);

    if(i%2==0 && heap[i]>heap[i+1] && i+1<=n)
        Swap(i,i+1);
}

void heap_insert(int &n,int x)
{
    n++;
    nr++;
    heap[n]=x;
    numar[nr]=nr;
    pos[nr]=n;
    int i=n;
    while(heap[i]<heap[i/2] && i/2>=1)
    {
        Swap(i,i/2);
        check_sib(i,n);
        i=i/2;
    }

    check_sib(i,n);
}

void heap_delete(int &n,int x)
{

    int elem,ok=1;
    elem=pos[x];
    heap[elem]=heap[n];
    n--;
    int i=elem;

    while(heap[i]<heap[i/2] && i/2>=1)
    {
        Swap(i,i/2);
        check_sib(i,n);
        i=i/2;
    }

    while((heap[i]>heap[2*i] || heap[i]>heap[2*i+1]) && 2*i<=n)
    {
        if(heap[i]>heap[2*i])
        {
        Swap(i,2*i);
        check_sib(i,n);
        i=2*i;
        }else{
            if(2*i+1<=n)
            {
            Swap(i,2*i+1);
            check_sib(i,n);
            }
            i=2*i;
        }
    }
    check_sib(i,n);
}

void printheap(int n)
{
    for(int i=1;i<=n;i++)
        cout << heap[i] << " ";
    cout << "\n";
    for(int i=1;i<=nr;i++)
        cout << pos[i] << " ";
    cout << "\n";
     for(int i=1;i<=nr;i++)
        cout << numar[i] << " ";
     cout << "\n\n";
}

int main()
{
    int n=0;
    int m,x,a;
    f>>m;
    for(int i=0;i<m;i++)
    {
        f>>a;
        if(a==1)
        {
            f>>x;
            heap_insert(n,x);
        }

        if(a==2)
        {
            f>>x;
            heap_delete(n,x);
        }

        if(a==3)
            g << heap[1] << "\n";


    }

    return 0;
}