Cod sursa(job #991393)

Utilizator Eugen_VlasieFMI Vlasie Eugen Eugen_Vlasie Data 30 august 2013 13:54:15
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <fstream>

using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int heap[200010];
long long j,n,t,x,y,z,k,m,s,i,poz[200010],v[200010];
int main()
{
    f>>n;
    for(i=1;i<=n;i++)
        v[i]=1000000010;
    v[0]=1000000010;
    i=k=0;
    for(y=1;y<=n;y++)
    {
        f>>t;
        if(t==3)
            g<<v[heap[1]]<<'\n';
        else
            if(t==1)
            {
                f>>v[++i];
                heap[++k]=i;
                poz[i]=k;
                s=k;
                while(v[heap[s]]<v[heap[s/2]]&&s>1)
                {
                    x=heap[s];
                    heap[s]=heap[s/2];
                    heap[s/2]=x;
                    poz[heap[s]]=s;
                    poz[heap[s/2]]=s/2;
                    s/=2;
                }
            }
            else
            {
                f>>z;
                s=poz[z];
                heap[poz[z]]=heap[k];
                poz[heap[poz[z]]]=poz[z];
                heap[k]=0;
                poz[z]=0;
                v[z]=1000000010;
                k--;
                z=s;
                while(v[heap[z]]<v[heap[z/2]]&&z>1)
                {
                    x=heap[z];
                    heap[z]=heap[z/2];
                    heap[z/2]=heap[z];
                    poz[heap[z]]=z;
                    poz[heap[z/2]]=z/2;
                    z/=2;
                }
                while(v[heap[z]]>v[heap[z*2]]||v[heap[z]]>v[heap[z*2+1]])
                {
                    if(v[heap[z*2]]<v[heap[z*2+1]])
                        j=z*2;
                    else
                        j=z*2+1;
                    x=heap[z];
                    heap[z]=heap[j];
                    heap[j]=x;
                    poz[heap[z]]=z;
                    poz[heap[j]]=j;
                    z=j;
                }
            }
    }
    return 0;
}