Cod sursa(job #2299475)

Utilizator bleo16783FMI Bleotiu Cristian bleo16783 Data 9 decembrie 2018 17:05:59
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

#define nmax 200100

int n,m,o,p,x;
int h[nmax];
int v[nmax];
int t[nmax];

void up(int p)
{
    while(p>1 && h[p]<h[p/2])
    {
        swap(h[p],h[p/2]);
        swap(v[t[p]],v[t[p/2]]);
        swap(t[p],t[p/2]);
        p/=2;
    }
}

void down(int p)
{
    if((p<<1)<=n && (p<<1)+1<=n && h[p<<1]<h[(p<<1)+1] && h[p<<1]<h[p])
    {
        swap(h[p],h[p<<1]);
        swap(v[t[p]],v[t[p<<1]]);
        swap(t[p],t[p<<1]);
        down(p<<1);
    }
    else
    if((p<<1)<=n && (p<<1)+1<=n && h[p<<1]>h[(p<<1)+1] && h[(p<<1)+1]<h[p])
    {
        swap(h[p],h[(p<<1)+1]);
        swap(v[t[p]],v[t[(p<<1)+1]]);
        swap(t[p],t[(p<<1)+1]);
        down((p<<1)+1);
    }
    else
    if((p<<1)<=n && h[p<<1]<h[p])
    {
        swap(h[p],h[p<<1]);
        swap(v[t[p]],v[t[p<<1]]);
        swap(t[p],t[p<<1]);
        down(p<<1);
    }
}

int main()
{
    fin>>m;
    for( ; m; --m)
    {
        fin>>p;
        if(m==15)
            int ok=1;
        switch(p)
        {
        case 1:
            fin>>x;
            h[++n]=x;
            v[++o]=n;
            t[n]=o;
            up(n);
            break;
        case 2:
            fin>>x;
            p=v[x];
            swap(h[p],h[n]);
            swap(v[t[p]],v[t[n]]);
            swap(t[p],t[n]);
            --n;
            up(p);
            down(p);
            break;
        case 3:
            fout<<h[1]<<'\n';
            break;
        }
    }
}