Cod sursa(job #2082693)

Utilizator Andrei243Nitu Mandel Andrei Andrei243 Data 6 decembrie 2017 18:17:16
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
//#include <iostream>
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
struct el
{
    int val,pos;

};

el heap[200100];
int pozitii[200100];
int j;
int marime_heap;

void swap(int x,int y)
{
el aux=heap[x];
heap[x]=heap[y];
heap[y]=aux;


    pozitii[heap[x].pos]^=pozitii[heap[y].pos];
    pozitii[heap[y].pos]^=pozitii[heap[x].pos];
    pozitii[heap[x].pos]^=pozitii[heap[y].pos];
}

int min_heapify(int x)
{
    if(x<=marime_heap)
    {

        int minim=x;
        int st=2*x;
        int dr=2*x+1;
        if(st<=marime_heap&&heap[st].val<heap[minim].val)minim=st;
        if(dr<=marime_heap&&heap[dr].val<heap[minim].val)minim=dr;
        if(minim!=x)
        {

            swap(minim,x);
            return min_heapify(minim);
        }
        else return x;
    }
}

void urcare(int x)
{

    while(x!=1&&heap[x].val<heap[x/2].val)
    {
        swap(x,x/2);
        x/=2;
    }
}


void inserare(int el)
{
    marime_heap++;
    j++;
    heap[marime_heap].val=el;
    heap[marime_heap].pos=j;
    pozitii[j]=marime_heap;
    urcare(marime_heap);
}

void stergere(int cron)
{

    int var=pozitii[cron];

    swap(pozitii[cron],marime_heap);

    marime_heap--;
    int pozitie=min_heapify(var);
    urcare(pozitie);
}


int main()
{
    int val;
    int poz_sters;
    int nrop;
    int op;
    in>>nrop;
    for(int i=1; i<=nrop; i++)
    {
        in>>op;


        switch(op)
        {
        case 1:
        {
            in>>val;
            inserare(val);
            break;
        }

        case 2 :
        {
            in>>poz_sters;
            stergere(poz_sters);
            break;

        }

        case 3:
        {
            out<<heap[1].val<<'\n';
            break;
        }



        }
/*for(int gsg=1;gsg<=marime_heap;gsg++)cout<<heap[gsg].val<<"  "<<heap[gsg].pos<<'\n';
cout<<"HEAP"<<"\n";*/
    }

    return 0;

}