Cod sursa(job #2295126)

Utilizator zsraduZamfir Radu zsradu Data 3 decembrie 2018 10:18:36
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 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],intrat=0;///in poz[al catelea elem a intrat]=pozitia in heap
int poz2[200003];///in poz2[pozitia in heap]=poz[al catelea elem a intrat]
int tata(int k)
{
    return (k/2);
}
int st(int k)
{
    int x=k*2;
    if(x<=lv)
        return x;
    else return 0;
}
int dr(int k)
{
    int x=k*2+1;
    if(x<=lv)
        return x;
    else return 0;
}
void up(int k)
{
    while(k>1 && v[k]<v[tata(k)])
    {
        swap(poz[poz2[k]],poz[poz2[tata(k)]]);
        swap(poz2[k],poz2[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[poz2[k]],poz[poz2[st(k)]]);
            swap(poz2[k],poz2[st(k)]);
            swap(v[k],v[st(k)]);
            k=st(k);
        }
        else if(dr(k))
        {
            swap(poz[poz2[k]],poz[poz2[dr(k)]]);
            swap(poz2[k],poz2[dr(k)]);
            swap(v[k],v[dr(k)]);
            k=dr(k);
        }
    }
}
int main()
{
    //cout<<(sizeof(poz)/1024.0)/1024.0;
    f>>n;
    for(int i=1;i<=n;i++)
    {
        f>>tip;
        if(tip==1)
        {
            intrat++;
            f>>nr;
            lv++;
            poz[intrat]=lv;
            poz2[lv]=intrat;
            v[lv]=nr;
            up(lv);
        }
        else if(tip==2)
        {
            f>>nr;
            if(nr==lv)lv--;
            else
            {
                nr=poz[nr];
                lv--;
                v[nr]=v[lv+1];
                poz[nr]=poz[lv+1];
                poz2[nr]=poz2[lv+1];
                if(v[nr]<v[tata(nr)] && tata(nr))
                    up(nr);
                else if((v[nr]>v[st(nr)] && st(nr)) || (v[nr]>v[dr(nr)] && dr(nr)))
                    down(nr);
            }
        }
        else g<<v[1]<<'\n';
    }
}