Cod sursa(job #2552355)

Utilizator Alex62493Manghiuc Alexandru Alex62493 Data 20 februarie 2020 19:40:39
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <bits/stdc++.h>
#include <cstdio>

using namespace std;

FILE* fin=fopen("heapuri.in", "r");
FILE* fout=fopen("heapuri.out", "w");

int v[200002], n, nr, p[200002], k, ha[200001];

void Urcare(int nod)
{
    int auxv=v[nod], auxp=p[nod];
    while (v[nod/2]>auxv && nod/2>=1)
    {
        v[nod]=v[nod/2];
        p[nod]=p[nod/2];
        ha[p[nod]]=nod;
        nod/=2;
    }
    v[nod]=auxv;
    p[nod]=auxp;
    ha[p[nod]]=nod;
}

void Coborare(int nod)
{
    int auxv=v[nod], auxp=p[nod];
    while (min(v[nod*2], v[nod*2+1])<auxv && nod*2<=nr)
    {
        if (nod*2<nr)
        {
            int son=v[nod*2]<=v[nod*2+1]?nod*2:nod*2+1;
            v[nod]=v[son];
            p[nod]=p[son];
            ha[p[nod]]=nod;
            nod=son;
        }
        else
        {
            if (v[nod*2]<auxv)
            {
                v[nod]=v[nod*2];
                p[nod]=p[nod*2];
                ha[p[nod]]=nod;
                nod*=2;
            }
            else
                break;
        }
    }
    v[nod]=auxv;
    p[nod]=auxp;
    ha[p[nod]]=nod;
}

void Delet(int nod)
{
    v[nod]=v[nr];
    p[nod]=p[nr];
    ha[p[nod]]=nod;
    nr--;
    if (v[nod]<v[nod/2] && nod!=1)
        Urcare(nod);
    else
        Coborare(nod);
}

void Enter(int val)
{
    nr++;
    k++;
    v[nr]=val;
    p[nr]=k;
    ha[k]=nr;
    Urcare(nr);
}

int main()
{
    fscanf(fin, "%d", &n);
    for (int i=1; i<=n; i++)
    {
        int x, a;
        fscanf(fin, "%d", &x);
        if (x==1)
        {
            fscanf(fin, "%d", &a);
            Enter(a);
        }
        else if (x==2)
        {
            fscanf(fin, "%d", &a);
            Delet(ha[a]);
        }
        else
        {
            fprintf(fout, "%d\n", v[1]);
        }
    }
    fclose(fin);
    return 0;
}