Cod sursa(job #2617730)

Utilizator etienAndrone Stefan etien Data 22 mai 2020 18:18:02
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 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 heap[200001];
void afisare()
{
    for(int j=1;j<=s;j++)
        fout<<heap[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++;
            heap[s].val=x;
            heap[s].ord=nr;
            poz[nr]=s;
            p=s;
            while(p>1&&heap[p].val<heap[p/2].val)
            {
                swap(heap[p],heap[p/2]);
                swap(poz[heap[p].ord],poz[heap[p/2].ord]);
                p/=2;
            }
        }
        else if(op==2)
        {
            fin>>x;
            int k=poz[x];
            swap(heap[s],heap[k]);
            swap(poz[heap[s].ord],poz[heap[k].ord]);
            heap[s]={0,0};
            s--;
            p=k;
            while(p>1&&heap[p].val<heap[p/2].val)
            {
                swap(heap[p],heap[p/2]);
                swap(poz[heap[p].ord],poz[heap[p/2].ord]);
                p/=2;
            }
            if(p*2<=s&&heap[p*2].val<heap[p].val)
                p=p*2;
            else if(p*2+1<=s&&heap[p*2+1].val<heap[p].val)
                p=p*2+1;
            else continue;
            while(p<=s)
            {
                swap(heap[p],heap[p/2]);
                swap(poz[heap[p].ord],poz[heap[p/2].ord]);
                if(p*2<=s&&heap[p*2].val<heap[p].val)
                    p=p*2;
                else if(p*2+1<=s&&heap[p*2+1].val<heap[p].val)
                    p=p*2+1;
                else break;
            }
        }
        else fout<<heap[1].val<<" ";
    }
}