Cod sursa(job #1513847)

Utilizator refugiatBoni Daniel Stefan refugiat Data 30 octombrie 2015 08:19:00
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
//FILE*si=fopen("pom.in","r");
ifstream si("heapuri.in");
ofstream so("heapuri.out");
int heap[200002],lg;
int poz[200002],v[200002];
int nr;
void schimb(int a,int b)
{
    int aux=heap[a];
    heap[a]=heap[b];
    heap[b]=aux;
}
void up(int p)
{
    while(p>>1&&v[heap[p]]<v[heap[p>>1]])
    {
        schimb(p,p>>1);
        poz[heap[p]]=p;
        poz[heap[p>>1]]=p>>1;
        p>>=1;
    }
}
void down(int p)
{
    int fiu=-1;
    while(p!=fiu)
    {
        fiu=p;
        if(fiu*2<=lg&&v[heap[p]]>v[heap[fiu*2]])
        {
            p=fiu*2;
        }
        if(fiu*2+1<=lg&&v[heap[p]]>v[heap[fiu*2+1]])
        {
            p=fiu*2+1;
        }
        schimb(p,fiu);
        poz[heap[p]]=p;
        poz[heap[fiu]]=fiu;

    }
}
int main()
{
    int n;
    si>>n;
    int a,i,b;
    for(i=0;i<n;++i)
    {
        si>>a;
        if(a==1)
        {
            ++nr;
            ++lg;
            si>>v[nr];
            poz[nr]=lg;
            heap[lg]=nr;
            up(lg);
        }
        else
        {
            if(a==2)
            {
                si>>b;
                v[b]=-1;
                up(poz[b]);
                poz[heap[1]]=0;
                heap[1]=heap[lg];
                --lg;
                poz[heap[1]]=1;
                down(1);
            }
            else
                if(a==3)
                    so<<v[heap[1]]<<'\n';
        }
    }
    so.close();
//    fclose(si);
    return 0;
}