Cod sursa(job #2730272)

Utilizator butasebiButa Gabriel-Sebastian butasebi Data 25 martie 2021 23:54:04
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.81 kb
#include <bits/stdc++.h>
#define Nmax 200005
using namespace std;
struct heap_node
{
    int val, poz_in_vec;
}v[250005], aux;
int w[200005];
/*
void heap_push(int poz, heap_node Node)
{
    if(v[poz].poz_in_vec == 0 || Node.val < v[poz].val)
    {
        if(v[poz].poz_in_vec != 0)
        {
            if(v[2 * poz].poz_in_vec == 0)heap_push(2 * poz, v[poz]);
            else if (v[2 * poz + 1].poz_in_vec == 0)heap_push(2 * poz + 1, v[poz]);
            else if(v[2 * poz].val > v[2 * poz + 1].val)heap_push(2 * poz, v[poz]);
            else heap_push(2 * poz + 1, v[poz]);
        }
        v[poz] = Node;
        w[v[poz].poz_in_vec] = poz;            // w[poz] = the node in heap where we have the poz-th elem
    }
    else
    {
        if(v[2 * poz].poz_in_vec == 0)heap_push(2 * poz, Node);
        else if (v[2 * poz + 1].poz_in_vec == 0)heap_push(2 * poz + 1, Node);
        else if(v[2 * poz].val > v[2 * poz + 1].val)heap_push(2 * poz, Node);
        else heap_push(2 * poz + 1, Node);
    }
}
*/
void lift(int poz)
{
    if(v[poz / 2].val > v[poz].val && poz / 2 > 0)
    {
        swap(v[poz], v[poz / 2]);
        if(v[poz / 2].poz_in_vec != 0)swap(w[v[poz].poz_in_vec], w[v[poz / 2].poz_in_vec]);
        lift(poz / 2);
    }
}
void heap_push(heap_node Node, int ct)
{
    for(int i = 1; i <= Nmax; i ++)
        if(v[i].poz_in_vec == 0)
        {
            v[i] = Node;
            w[ct] = i;
            lift(i);
            break;
        }
}
void remove_heap_node(int poz)
{
    if(v[2 * poz].poz_in_vec == 0 && v[2 * poz + 1].poz_in_vec == 0)
    {
        v[poz].poz_in_vec = 0;
    }
    else if(v[2 * poz].poz_in_vec == 0)
    {
        v[poz] = v[2 * poz + 1];
        w[v[poz].poz_in_vec] = poz;
        remove_heap_node(2 * poz + 1);
    }
    else if(v[2 * poz + 1].poz_in_vec == 0)
    {
        v[poz] = v[2 * poz];
        w[v[poz].poz_in_vec] = poz;
        remove_heap_node(2 * poz);
    }
    else if(v[2 * poz].val < v[2 * poz + 1].val)
    {
        v[poz] = v[2 * poz];
        w[v[poz].poz_in_vec] = poz;
        remove_heap_node(2 * poz);
    }
    else
    {
        v[poz] = v[2 * poz + 1];
        w[v[poz].poz_in_vec] = poz;
        remove_heap_node(2 * poz + 1);
    }
}
int n, i, op, ct, x, pozz;
int main()
{
    ifstream f("heapuri.in");
    ofstream g("heapuri.out");
    f >> n;
    for(i = 1; i <= n; i ++)
    {
        f >> op;
        if(op == 1)
        {
            f >> x;
            ct = ct + 1;
            aux.val = x;
            aux.poz_in_vec = ct;
            heap_push(aux, ct);
        }
        if(op == 2)
        {
            f >> pozz;
            remove_heap_node(w[pozz]);
        }
        if(op == 3)
        {
            g << v[1].val << "\n";
        }
    }
    return 0;
}