Cod sursa(job #2565732)

Utilizator zsraduZamfir Radu zsradu Data 2 martie 2020 16:29:18
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int hp[200003];
int pozhp[200003];///pozhp[i]=x inseamna ca nr citit al i-lea este pe poz x in heap
int pozcit[200003];///pozcit[x]=i inseamna ca nr de pe poz x in heap a fost citit al i-lea
int n,i;
int lv,nrcit=0;
void pb1()
{
    int nr;nrcit++;
    f>>nr;
    lv++;
    pozhp[nrcit]=lv;
    pozcit[lv]=nrcit;
    hp[lv]=nr;
    int poz=lv;
    while(poz/2>0 && hp[poz]<hp[poz/2])
    {
        swap(hp[poz],hp[poz/2]);
        swap(pozhp[pozcit[poz]],pozhp[pozcit[poz/2]]);
        swap(pozcit[poz],pozcit[poz/2]);
        poz=poz/2;
    }
}
void pb2()
{
    int nr;
    f>>nr;
    ///trb sa elimin nr de pe pozitia nr in citit din heap
    int poz=pozhp[nr];///aceasta e pozitia din heap
    swap(hp[lv],hp[poz]);
    int x=pozhp[poz],y=pozhp[lv];
    swap(pozhp[pozcit[poz]],pozhp[pozcit[lv]]);
    swap(pozcit[poz],pozcit[lv]);
    lv--;
    while(poz*2<=lv)
    {
        if((hp[poz]<hp[2*poz] || 2*poz>lv) && (hp[poz]<hp[2*poz+1] || 2*poz+1>lv))break;
        int pozsch;
        if(hp[2*poz]<hp[2*poz+1])pozsch=2*poz;
        else if(2*poz+1<=lv)pozsch=2*poz+1;
        else pozsch=2*poz;


        swap(hp[poz],hp[pozsch]);
        swap(pozhp[pozcit[poz]],pozhp[pozcit[pozsch]]);
        swap(pozcit[poz],pozcit[pozsch]);
        poz=pozsch;
    }

}
int main()
{
    f>>n;
    for(i=1;i<=n;i++)
    {
        int pb;
        f>>pb;
        if(pb==1)
        {
            pb1();
        }
        else if(pb==2)
        {
            pb2();
        }
        else
            g<<hp[1]<<'\n';
    }
}