Cod sursa(job #2667550)

Utilizator metallidethantralayerIon Cojocaru metallidethantralayer Data 3 noiembrie 2020 17:09:01
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("heapuri.in");
ofstream g("heapuri.out");

int q,v[200005],h,poz[200005],cnt;
map<int,int> M;
void SiftUp(int i)
{
    if(i>1)
    {
        if(v[i]<v[i/2])
            swap(M[v[i]],M[v[i/2]]),swap(v[i],v[i/2]),SiftUp(i/2);
    }
}
void SiftDown(int i)
{
    int k=2*i;
    if(k<=h)
    {
        if(k+1<=h&&v[k+1]<v[k])
            k++;
        if(v[i]>v[k])
            swap(M[v[i]],M[v[k]]),swap(v[i],v[k]),SiftDown(k);
    }
}
int main()
{
    f>>q;
    while(q--)
    {
        int cer,x;
        f>>cer;
        assert(cer==1||cer==2||cer==3);
        if(cer==1)
        {
            f>>x;
            v[++h]=x;
            poz[++cnt]=x;
            M[x]=h;
            SiftUp(h);
        }
        else if(cer==2)
        {
            f>>x;
            M[v[h]]=M[poz[x]],swap(v[M[poz[x]]],v[h--]),SiftDown(M[poz[x]]);
        }
        else
            g<<v[1]<<'\n';
    }

    return 0;
}