Cod sursa(job #2082985)

Utilizator ScarymovieMocanu Alexandru Scarymovie Data 6 decembrie 2017 22:27:52
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include<bits/stdc++.h>
#define NMAX 200005
using namespace std;
struct element
{
    int val,poz;
};
element h[NMAX];
int poz[NMAX],HeapSize=0,PozSize=0;
void Interschimba(int nod1,int nod2)
{
    h[nod1].val^=h[nod2].val^=h[nod1].val^=h[nod2].val;
    h[nod1].poz^=h[nod2].poz^=h[nod1].poz^=h[nod2].poz;
    poz[h[nod1].poz]^=poz[h[nod2].poz]^=poz[h[nod1].poz]^=poz[h[nod2].poz];
}
int HeapifyUp(int nod)
{
    if(nod>HeapSize) return nod;
    while(nod!=1 && h[nod].val<h[nod/2].val)
    {
        Interschimba(nod,nod/2);
        nod/=2;
    }
    return nod;
}
void InsertInHeap(int valoare)
{
    ++HeapSize;++PozSize;
    h[HeapSize].val=valoare;
    h[HeapSize].poz=PozSize;
    poz[PozSize]=HeapSize;
    HeapifyUp(HeapSize);
}
void MinHeapify(int nod)
{
    if(nod>HeapSize) return ;
    int Minim=nod;
    if(2*nod<=HeapSize && h[2*nod].val<h[Minim].val) Minim=2*nod;
    if(2*nod+1<=HeapSize && h[2*nod+1].val<h[Minim].val) Minim=2*nod+1;
    if(Minim!=nod)
    {
        Interschimba(Minim,nod);
        MinHeapify(Minim);
    }
}
void DeleteFromHeap(int pozitie)
{
    int nod=poz[pozitie];
    Interschimba(HeapSize,nod);
    HeapSize--;
    nod=HeapifyUp(nod);
    MinHeapify(nod);
}
int main()
{
    ifstream f("heapuri.in");
    ofstream g("heapuri.out");
    int n,i,op,x;
    f>>n;
    for(i=0; i<n; ++i)
    {
        f>>op;
        if(op==1)
        {
            f>>x;
            InsertInHeap(x);
            continue;
        }
        if(op==2)
        {
            f>>x;
            DeleteFromHeap(x);
            continue;
        }
        g<<h[1].val<<'\n';
    }
    return 0;
}