Cod sursa(job #2617744)

Utilizator etienAndrone Stefan etien Data 22 mai 2020 18:33:03
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#include<fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n,i,op,x,poz[200001],s;
struct elem
{
    int val,ord;
};
elem h[200001];
void afisare()
{
    for(int j=1;j<=s;j++)
        fout<<h[j].val<<" ";
    fout<<"\n";
}
int main()
{
    fin>>n;
    int nr=0;
    for(i=1; i<=n; i++)
    {
        int p;
        fin>>op;
        if(op==1)
        {
            fin>>x;
            nr++;
            s++;
            h[s].val=x;
            h[s].ord=nr;
            poz[nr]=s;
            p=s;
            while(p>1&&h[p].val<h[p/2].val)
            {
                swap(h[p],h[p/2]);
                swap(poz[h[p].ord],poz[h[p/2].ord]);
                p/=2;
            }
        }
        else if(op==2)
        {
            fin>>x;
            int k=poz[x];
            swap(h[s],h[k]);
            swap(poz[h[s].ord],poz[h[k].ord]);
            h[s]={0,0};
            s--;
            p=k;
            while(p>1&&h[p].val<h[p/2].val)
            {
                swap(h[p],h[p/2]);
                swap(poz[h[p].ord],poz[h[p/2].ord]);
                p/=2;
            }
            while(p<=s)
            {
                int pmin1=0,pmin2=0,cf;
                if(p*2+1<=s)
                    if(h[p*2+1].val<h[p].val)
                        pmin1=p*2+1;
                if(p*2<=s)
                    if(h[p*2].val<h[p].val)
                        pmin2=p*2;
                if(pmin1==0&&pmin2==0)
                    break;
                else if(pmin1==0)
                    p=pmin2;
                else if(pmin2==0)
                    p=pmin1;
                else
                {
                    if(h[pmin1].val<h[pmin2].val)
                        cf=pmin1;
                    else cf=pmin2;
                    p=cf;
                }
                swap(h[p],h[p/2]);
                swap(poz[h[p].ord],poz[h[p/2].ord]);
            }
        }
        else fout<<h[1].val<<"\n";
        //afisare();
    }
}