Cod sursa(job #2139187)

Utilizator MarinPeptenaruMarin Vasile Peptenaru MarinPeptenaru Data 22 februarie 2018 10:56:41
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.26 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
const int nx=200002;
int pozh[nx],pozv[nx],h[nx],nh,nv,op,x,n;
/// pozh[i] - pozitia in heap al celui de-al i-lea nr din sir
/// pozv[i] - pozitia in sir al nodului i din heap;
void go_up (int x) /// fac nodul x sa urce in heap, daca se poate
{
    if(x==1) return;
    if(h[x]>=h[x/2]) return; /// daca tatal e mai mic decat nu urc
    swap(h[x],h[x/2]); /// interschimb valorile din noduri
    swap(pozh[pozv[x]],pozh[pozv[x/2]]); /// interschimb pozitiile lor in heap
    swap(pozv[x],pozv[x/2]);/// interschimb si pozitiile lor in sir
    go_up(x/2); /// incerc sa urc si mai mult
}
void go_down (int x) /// cobor nodul x in heap, daca se poate
{
    int fiu=0;
    if(2*x<=nh) /// daca exista fiu stang
    {
        fiu=2*x;
        if(fiu+1<=nh && h[fiu+1]<h[fiu]) /// verific daca am fiu drept si daca este fiul de valoare minima
            fiu++; /// daca da atunci iau drept fiu pe cel drep
        if(h[fiu]>=h[x]) /// daca fiul are o valoare mai mare decat cea a lui x
            fiu=0; /// atunci nu are sens sa il cobor
    }
    if(fiu)
    {
        swap(h[fiu],h[x]); /// schimb valorile din heap
        swap(pozh[pozv[fiu]],pozh[pozv[x]]); /// schimb pozitiile din heap
        swap(pozv[fiu],pozv[x]); /// schimb pozitiile din sir
        go_down(fiu); /// cobor si fiul , daca se poate
    }
}
void push (int x) /// il adaug pe x in heap
{
    nh++;
    nv++;
    pozh[nv]=nh; /// e ultimul nod din heap
    pozv[nh]=nv; /// de asemenea ultimul din sir
    h[nh]=x; /// il pun pe ultimul nod din heap
    go_up(nh); /// il urc in heap, daca se poate
}
void pop (int x) /// sterg al x-lea numar din sir din heap
{
    int poz=pozh[x]; /// aflu pe ce nod se afla al x-lea nr in heap
    swap(h[poz],h[nh]);
    /// il interschimb cu ultimul nod
    nh--; /// si il elimim;
    go_up(poz);
    go_down(poz);
    /// apoi aflu pozitia crespunzatoare a nodului poz in heap
}
int main()
{
    for(in>>n;n;n--)
    {
        in>>op;
        if(op!=3)
            in>>x;
        if(op==1)
            push(x);
        else if(op==2)
            pop(x);
        else if(op==3)
            out<<h[1]<<'\n';
    }

    return 0;
}