Cod sursa(job #2891106)

Utilizator EduardSanduSandu Eduard Alexandru EduardSandu Data 17 aprilie 2022 15:51:18
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.54 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

int v[200005], poz[200005], heap[200005], dimensiune = 0, element = 0;

void heapify(int x)
{
    while(x/2 > 0 && v[heap[x]] < v[heap[x/2]])
    {
        swap(heap[x], heap[x/2]);
        poz[heap[x]] = x;
        poz[heap[x/2]] = x/2;
        x /= 2;
    }
}

void downify(int x)
{
    while(2*x <= dimensiune) // daca are minim un nod
    {
        int kid1 = 2*x;
        int kid2 = 2*x + 1;
        if(2*x + 1 <= dimensiune) //sunt 2 noduri
        {
            if(v[heap[x]] < v[heap[kid1]] && v[heap[x]] < v[heap[kid2]]) // daca e cel mai mic ramane asa
            {
                break;
            }
            else
            {
                if(v[heap[kid1]] < v[heap[kid2]]) //daca e primu mai mic ca celalalt
                {
                    swap(heap[x], heap[kid1]);
                    poz[heap[x]] = x;
                    poz[heap[kid1]] = kid1;
                    x = kid1;
                }
                else
                {
                    swap(heap[x], heap[kid2]);
                    poz[heap[x]] = x;
                    poz[heap[kid2]] = kid2;
                    x = kid2;
                }
            }
        }
        else //e un singur nod
        {
            if(v[heap[x]] <= v[heap[kid1]])
                break;
            else
            {
                swap(heap[x], heap[kid1]);
                poz[heap[x]] = x;
                poz[heap[kid1]] = kid1;
                x = kid1;
            }
        }
    }
}

void deletion(int x)
{
    int deletepoz = poz[x];
    swap(heap[deletepoz], heap[dimensiune]);
    poz[heap[deletepoz]] = deletepoz;
    poz[heap[dimensiune]] = dimensiune;
    dimensiune--;
    int tata = deletepoz / 2;
    if(deletepoz == 1 || v[heap[tata]] < v[heap[deletepoz]])
        downify(deletepoz);
    else
        heapify(deletepoz);
}

int main()
{
    int n,i,j,k,nr, index = 1,tip;
    fin>>n;
    for(i=1;i<=n;i++)
    {
        fin>>tip;
        if(tip == 1)
        {
            fin>>nr;
            dimensiune ++;
            element++;
            heap[dimensiune] = element;
            v[element] = nr;
            poz[element] = dimensiune;
            heapify(dimensiune);
        }
        else if(tip == 2)
        {
            fin>>nr;
            deletion(nr);
        }
        else if(tip == 3)
        {
            fout<<v[heap[1]]<<'\n';
        }
    }
    return 0;
}