Cod sursa(job #2543290)

Utilizator mihaela.macarie01@yahoo.comMihaela Macarie [email protected] Data 11 februarie 2020 00:05:06
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
#define N 200202

using namespace std;

ifstream x("heapuri.in");
ofstream y("heapuri.out");

int n,nr,i,j,k,c,nod,m,h[N],ord[N],poz[N];

void percolate(int h[N], int n, int k)
{
    int key=h[k],o=ord[k];
    while(k>1 && key<h[k/2])
    {
        poz[ord[k/2]]=k;
        ord[k]=ord[k/2];
        h[k]=h[k/2];
        k/=2;
    }
    h[k]=key;
    ord[k]=o;
    poz[o]=k;
}

void shift(int h[N], int n, int k)
{
    int son,key=h[k],o=ord[k];
    do
    {
        son=0;
        if(k*2<=n)
        {
            son=k*2;
            if(son+1<=n && h[son+1]<h[son])
                son+=1;
        }
        if(son && key>h[son])
        {
            poz[ord[son]]=k;
            ord[k]=ord[son];
            h[k]=h[son];
            k=son;
        }
        else
            son=0;
    }while(son);
    h[k]=key;
    ord[k]=o;
    poz[o]=k;
}

void cut(int h[N], int &n, int k)
{
    h[poz[k]]=h[n];
    poz[ord[n]]=poz[k];
    ord[poz[k]]=ord[n];
    n--;
    percolate(h,n,poz[k]);
    shift(h,n,poz[k]);
}

void insert_h(int nod)
{
    h[++n]=nod;
    j++;
    ord[n]=j;
    poz[j]=n;
    percolate(h,n,n);
}

int main()
{
    x>>nr;
    for(i=1;i<=nr;i++)
    {
        x>>c;
        if(c==1)
        {
            x>>nod;
            insert_h(nod);
        }
        else
        {
            if(c==2)
            {
                x>>nod;
                cut(h,n,nod);
            }
            else
                y<<h[1]<<'\n';
        }
    }
    x.close();
    y.close();
    return 0;
}