Cod sursa(job #2379307)

Utilizator EricEric Vilcu Eric Data 13 martie 2019 12:17:16
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int a[200001],o[200001],v[200001];
int n,q,x,k,N;
int UP(int l)
{
    while(l>1&&v[a[l]]<v[a[l/2]]){swap(a[l],a[l/2]);swap(o[a[l]],o[a[l/2]]);l=l/2;}
    return l;
}
int DOWN(int l)
{
    while(2*l<=k)
    {
        if(2*l+1<=k)
        {
            if(v[a[l]]<=v[a[2*l]])
            {
                if(v[a[l]]<=v[a[2*l+1]])return l;
                else{swap(a[l],a[l*2+1]);swap(o[a[l]],o[a[l*2+1]]);l=l*2+1;}
            }
            else
            {
                if(v[a[l]]<=v[a[2*l+1]]){swap(a[l],a[l*2]);swap(o[a[l]],o[a[l*2]]);l=l*2;}
                else
                {
                    if(v[a[2*l]]<=v[a[2*l+1]]){swap(a[l],a[l*2]);swap(o[a[l]],o[a[l*2]]);l=l*2;}
                    else{swap(a[l],a[l*2+1]);swap(o[a[l]],o[a[l*2+1]]);l=l*2+1;}
                }

            }
        }
        else
        {
            if(v[a[l]]>v[a[2*l]]){swap(a[l],a[l*2]);swap(o[a[l]],o[a[l*2]]);l=l*2;}
            return l;
        }
    }
    return l;
}
int main()
{
    for(f>>n;n>0;--n)
    {
        f>>q;
        if(q==3)g<<v[a[1]]<<'\n';
        else
        {
            f>>x;
            if(q==1)
            {
                ++k;++N;a[k]=N;v[N]=x;o[N]=k;
                UP(k);
            }
            else
            {
                x=o[x];
                swap(a[x],a[k]);swap(o[a[x]],o[a[k]]);
                --k;
                int t=UP(x);
                if(t>=x)
                {
                    DOWN(x);
                }
            }
        }
        //for(int i=1;i<=k;++i)cout<<v[a[i]]<<' ';cout<<'\n';
        //for(int i=1;i<=N;++i)cout<<v[i]<<' ';cout<<'\n';
        //for(int i=1;i<=N;++i)cout<<o[i]<<' ';cout<<'\n';cout<<'\n';
    }
}