Cod sursa(job #2655037)

Utilizator MateGMGozner Mate MateGM Data 3 octombrie 2020 10:40:11
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.28 kb
#include <iostream>
#include<climits>
#include <fstream>

using namespace std;

ifstream be("heapuri.in");
ofstream ki("heapuri.out");

struct elem{
int ertek;
int sorszam;
};

int hs=0;
elem h[200002];
int helye[200002];

int parent(int i)
{
    return ((i-1)/2);
}

int left(int i)
{
    return (2*i+1);
}

int right(int i)
{
    return (2*i+2);
}

void swap1(int i,int j)
{
    elem temp=h[i];
    h[i]=h[j];
    h[j]=temp;
    helye[h[i].sorszam]=i;
    helye[h[j].sorszam]=j;
}

void heap_add(int k,int db)
{
    hs++;
    int i=hs-1;
    h[i].ertek=k;
    h[i].sorszam=db;
    helye[db]=i;
    while(i!=0 && h[i].ertek<h[parent(i)].ertek)
    {
        swap1(i,parent(i));
        i=parent(i);
    }

}

void Heap_if(int i)
{
    int l=left(i);
    int r=right(i);
    int smallest=i;
    if(l<hs && h[l].ertek<h[i].ertek)
        smallest=l;
    if(r<hs && h[r].ertek<h[smallest].ertek)
        smallest=r;
    if(smallest!=i){
        swap1(i,smallest);
        Heap_if(smallest);
    }

}

void heap_elem_csere(int ertek,int i)
{
    h[i].ertek=ertek;
    h[i].sorszam=0;
    helye[0]=i;
    if(i!=0 && h[i].ertek<h[parent(i)].ertek)
    {
        swap1(i,parent(i));
        i=parent(i);
    }
}

int min_kiszedes()
{
    if (hs<0)
        return INT_MAX;
    if(hs==1)
    {
        hs--;
        return h[0].ertek;
    }
    int root=h[0].ertek;
    swap1(0,hs-1);
    hs--;
    Heap_if(0);
    return root;
}


void heap_delete(int i)
{
    h[helye[i]].ertek=INT_MAX;
    Heap_if(helye[i]);
    /*heap_elem_csere(INT_MIN,helye[i]);
    min_kiszedes();*/
}

int main()
{

    int n,k,c,db=0;
    be>>n;

    for(int i=0;i<n;i++)
    {
        be>>k;
       /* switch(k){
        case 1:
        heap_add(h,c);
        break;

        case 2:
        heap_delete(h,c-1);
        break;

        case 3:
        cout<<h[0]<<endl;
        break;
        }
        cout<<h[i]<<endl;*/
        if(k==1)
        {
            db++;
            be>>c;
            heap_add(c,db);
        }
        else if(k==2){
                be>>c;
            heap_delete(c);
        }
        else if(k==3)
        {
            ki<<h[0].ertek<<'\n';

        }

        }


    return 0;
}