Cod sursa(job #2401394)

Utilizator teodorgTeodor G teodorg Data 9 aprilie 2019 17:50:27
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
const int N = 200010;
int n,x[N],p[N],h[N],op,k,m,poz,i;
void heap_swap(int,int),heap_up(int),heap_down(int);
int main()
{
    f>>n;
    for(;n;n--)
    {
        f>>op;
        if(op==1)
        {
            f>>x[++k];
            m++; /// m = mumarul de elemente din heap
            /// in heap inserez timpul k la care a intrat valoarea -> am acces la valoare ( = x[k] )
            p[k]=m; /// p[k] = pozitia in heap pentru elementul intrat la momentul k
            h[m]=k; /// h[] = heap-ul cu semnificatia h[i] = k daca in heap pe pozitia i am elementul intrat la momentul k
                    /// de fapt in h tin momentul dar prin el am imediat acces la valoare ( valoare[i] = x[h[i]] )
            heap_up(m);
        }
        if(op==2)
        {
            f>>i; /// se citete un timp de intrare
            poz=p[i]; /// se localizeaza in ce pozitie din heap avem acel timp
            heap_swap(poz,m); /// se interschimba in heap acel timp cu cel de pe ultima pozitie
            m--; /// se "scurteaza" heap-ul cu un element - exact cel care trebuie eliminat
            heap_up(poz);
            heap_down(poz); /// cele doua apeluri rearanjeaza heap-ul
        }
        if(op==3)
            g<<x[h[1]]<<'\n';
    }
    return 0;
}
void heap_swap(int a,int b)
{
    swap(h[a],h[b]);
    p[h[a]]=a;p[h[b]]=b;
}
void heap_up(int fiu)
{
    int tata=fiu/2;
    if(!tata)return;
    if(x[h[tata]]<=x[h[fiu]])return;
    heap_swap(tata,fiu);heap_up(tata);
}
void heap_down(int tata)
{
    int fiu=2*tata;
    if(fiu>m)return;
    if(fiu<m)if(x[h[fiu+1]]<x[h[fiu]])fiu++;
    if(x[h[fiu]]<x[h[tata]]){heap_swap(tata,fiu);heap_down(fiu);}
}