Cod sursa(job #2416512)

Utilizator AlexNeaguAlexandru AlexNeagu Data 27 aprilie 2019 17:22:04
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int h[200001],v[200001],p[200001];
int k,n,nr,x,t;
void downheap(int poz)
{
    while(2*poz<=k)
    {
        int st=poz*2;
        if(st+1<=k&&v[h[st]]>v[h[st+1]])
            st++;
        if(v[h[poz]]>v[h[st]])
        {
            swap(h[poz],h[st]);
            p[h[poz]]=poz;
            p[h[st]]=st;
            poz=st;
        }
        else
            break;
    }
}
void upheap(int poz)
{
    while(poz/2>0)
    {
        int st=poz/2;
        if(v[h[poz]]<v[h[st]])
        {
            p[h[st]]=poz;
            p[h[poz]]=st;
            swap(h[poz],h[st]);
            poz=st;
        }
        else
            break;
    }
}
int main()
{
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        fin>>t;
        if(t==1)
        {
            k++;nr++;
            fin>>v[nr];
            h[k]=nr;
            p[nr]=k;
            upheap(k);
        }
        else if(t==2)
        {
            fin>>x;
            int pos=p[x];
            swap(p[x],p[h[k]]);
            swap(h[k],h[pos]);
            k--;
            upheap(pos);
            downheap(pos);
        }
        else
            fout<<v[h[1]]<<'\n';
    }

    return 0;
}