Cod sursa(job #2082954)

Utilizator ScarymovieMocanu Alexandru Scarymovie Data 6 decembrie 2017 22:03:10
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
struct element
{
    int val,poz;
};
vector<element> h;
vector<int> poz;
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];
}
void HeapifyUp(int nod)
{
    while(nod!=1 && h[nod].val<h[nod/2].val)
    {
        Interschimba(nod,nod/2);
        nod/=2;
    }
}
void InsertInHeap(int valoare)
{
    element aux;
    aux.val=valoare;
    aux.poz=poz.size();
    h.push_back(aux);
    poz.push_back(poz.size());
    HeapifyUp(h.size()-1);
}
void MinHeapify(int nod)
{
    int Minim=nod;
    if(2*nod<h.size() && h[2*nod].val<h[Minim].val) Minim=2*nod;
    if(2*nod+1<h.size() && 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(h.size()-1,nod);
    h.pop_back();
    HeapifyUp(nod);
    MinHeapify(nod);
}
int main()
{
    ifstream f("heapuri.in");
    ofstream g("heapuri.out");
    int n,i,op,x;
    f>>n;
    element aux;
    poz.push_back(0);
    h.push_back(aux);
    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;
}