Cod sursa(job #2299463)

Utilizator bleo16783FMI Bleotiu Cristian bleo16783 Data 9 decembrie 2018 16:47:32
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.4 kb
#include <iostream>
#include<fstream>
using namespace std;
int x,y,i,H,j,p,q,k,n,v[200001],h[200001],poz[200001],p2[19];
bool ok;
void ad(int a,int p)
{
    v[p]=a;
    h[++H]=p;
    j=H;
    poz[p]=H;
    while(v[h[j]]<v[h[j/2]])
    {
        swap (h[j],h[j/2]);
        poz[h[j]]=j;
        poz[h[j/2]]=j/2;
        j=j/2;
    }
}
void down(int i)
{
    ok=0;
    while(ok<1)
    {
        if(2*i+1<H)
        {
            if(v[h[2*i]]<v[h[2*i+1]])
            {
                if(v[h[i]]>v[h[2*i]])
                {
                    swap(h[i],h[2*i]);
                    poz[h[i]]=i;
                    poz[h[2*i]]=2*i;
                    i*=2;
                }
                else
                    ok=1;
            }
            else
            {
                if(v[h[i]]>v[h[2*i+1]])
                {
                    swap(h[i],h[2*i+1]);
                    poz[h[i]]=i;
                    poz[h[2*i+1]]=2*i+1;
                    i=i*2+1;
                }
                else
                    ok=1;
            }
        }
        else
        {
            if(2*i<H)
            {
                if(v[h[i]]>v[h[2*i]])
                {
                    swap(h[i],h[2*i]);
                    poz[h[i]]=i;
                    poz[h[2*i]]=2*i;
                    i*=2;
                }
                else
                    ok=1;
            }
            else
                ok=1;
        }
    }
}
int main()
{
    ifstream f("heapuri.in");
    f>>q;
    ofstream g("heapuri.out");
    p2[0]=1;for(i=1;i<19;++i)p2[i]=2*p2[i-1];
    for(p=0;p<q;++p)
    {
        f>>x;
        if(x>2)
        {
            if(H<2)
            {
                g<<v[h[1]]<<'\n';
            }
            else
            {
                if(H<3)
                {
                    if(v[h[2]]<v[h[1]])g<<v[h[2]]<<'\n';
                    else
                        g<<v[h[1]]<<'\n';
                }
                else
                {
                    if(v[h[2]]<v[h[1]])
                    {
                        if(v[h[2]]<v[h[3]])g<<v[h[2]]<<'\n';
                        else
                            g<<v[h[3]]<<'\n';
                    }
                    else
                    {
                        if(v[h[1]]<v[h[3]])
                        {
                            g<<v[h[1]]<<'\n';
                        }
                        else
                        {
                            g<<v[h[3]]<<'\n';
                        }
                    }
                }
            }
        }
        else
        {
            f>>y;
            if(x<2)
            {
                ++n;
                ad(y,n);
            }
            else
            {
                j=poz[y];
                if(j<H)
                {
                    poz[h[H]]=j;
                    swap(h[j],h[H]);
                    if(j>1)
                    {
                        swap(h[j],h[j/2]);
                        poz[h[j]]=j;
                        poz[h[j/2]]=j/2;
                        down(j/2);
                    }
                    else
                        down(1);
                    --H;
                }
                else
                    --H;
            }
        }
    }
    f.close();
    g.close();
    return 0;
}