Cod sursa(job #2552166)

Utilizator Alex62493Manghiuc Alexandru Alex62493 Data 20 februarie 2020 17:13:46
Problema Heapuri Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 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;

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];
        nod/=2;
    }
    v[nod]=auxv;
    p[nod]=auxp;
}

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<n)
        {
            v[nod]=min(v[nod*2], v[nod*2+1]);
            p[nod]=v[nod*2]<v[nod*2+1]?p[nod*2]:p[nod*2+1];
            nod=v[nod*2]<v[nod*2+1]?nod*2:nod*2+1;
        }
        else
        {
            if (v[nod*2]<auxv)
            {
                v[nod]=v[nod*2];
                p[nod]=p[nod*2];
                nod*=2;
            }
            else
                break;
        }
    }
    v[nod]=auxv;
    p[nod]=auxp;
}

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

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

int Gasire(int poz)
{
    for (int i=1; i<=nr; i++)
    {
        if (p[i]==poz)
            return i;
    }
}

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(Gasire(a));
        }
        else
        {
            fprintf(fout, "%d\n", v[1]);
        }
    }
    fclose(fin);
    return 0;
}