Cod sursa(job #1695902)

Utilizator vancea.catalincatalin vancea.catalin Data 27 aprilie 2016 23:08:17
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<iostream>
#include<fstream>
#include<set>
#define DX 200010
using namespace std;
fstream fin("heapuri.in",ios::in),fout("heapuri.out",ios::out);
int h[DX],n,nr,x[DX],poz[DX];
void up(int nod)
{
    int tata=nod/2;
    while(nod>1 && x[h[nod]]<x[h[tata]])
    {
        swap(poz[h[nod]],poz[h[tata]]);
        swap(h[nod],h[tata]);
        nod=tata;
        tata=nod/2;
    }
}
void down(int nod)
{
    int fiu,plod;
    do
    {
        plod=0;
        fiu=2*nod;
        if(fiu<=n)
        {
            plod=fiu;
            if(fiu<n && x[h[fiu+1]]<x[h[fiu]]) plod=fiu+1;
            if(x[h[plod]]>x[h[nod]]) plod=0;
        }
        if(plod!=0)
        {
            swap(poz[h[nod]],poz[h[plod]]);
            swap(h[nod],h[plod]);
            nod=plod;
        }
    }while(plod!=0);
}
int main()
{
    int m,i,j,a,b,t,auxa,auxp;
    fin>>m;
    for(i=1;i<=m;i++)
    {
        fin>>t;
        if(t==1)
        {
            fin>>a;
            n++;
            nr++;
            h[n]=nr;
            poz[nr]=n;
            x[nr]=a;
            up(n);
        }
        if(t==2)
        {
            fin>>a;
            auxa=x[h[poz[a]]];
            auxp=poz[a];

            h[auxp]=h[n];
            poz[h[n]]=auxp;
            n--;
            poz[a]=-1;


            if(auxa>x[h[auxp]])
                up(auxp);
            else
                down(auxp);
        }
        if(t==3)
        {
            fout<<x[h[1]]<<"\n";
        }
    }
}