Cod sursa(job #2294960)

Utilizator zsraduZamfir Radu zsradu Data 2 decembrie 2018 23:14:24
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int v[200003],n,tip,nr,lv,poz[200003];///in poz[pozitia in v] am al catelea elem a intrat
int tata(int k)
{
    return (k/2);
}
int st(int k)
{
    int x=k*2;
    if(x<=n)
        return x;
    else return 0;
}
int dr(int k)
{
    int x=k*2+1;
    if(x<=n)
        return x;
    else return 0;
}
void up(int k)
{
    while(k>1 && v[k]<v[tata(k)])
    {
        swap(poz[k],poz[tata(k)]);
        swap(v[k],v[tata(k)]);
        k=tata(k);
    }
}
void down(int k)
{
    while(v[k]>v[st(k)] || v[k]>v[dr(k)])
    {
        if(v[st(k)]<v[dr(k)] && st(k))
        {
            swap(poz[k],poz[st(k)]);
            swap(v[k],v[st(k)]);
            k=st(k);
        }
        else if(dr(k))
        {
            swap(poz[k],poz[dr(k)]);
            swap(v[k],v[dr(k)]);
            k=dr(k);
        }
    }
}
int main()
{
    f>>n;
    for(int i=1;i<=n;i++)
    {
        f>>tip;
        if(tip==1)
        {
            f>>nr;
            lv++;
            poz[lv]=i;
            up(lv);
        }
        else if(tip==2)
        {
            f>>nr;
            lv--;
            v[nr]=v[lv+1];
            poz[nr]=poz[lv+1];
            if(v[nr]<v[tata(nr)])
                up(nr);
            else if(v[nr]>v[st(nr)] || v[nr]>v[dr(nr)])
                down(nr);

        }
        else g<<v[1]<<'\n';
    }
}