Cod sursa(job #2738444)

Utilizator Vlad_AnicaAnica-Popa Vlad-Ioan Vlad_Anica Data 5 aprilie 2021 20:50:44
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.41 kb
#include <iostream>
#include <stdio.h>

using namespace std;
const int LOGNMAX = 19, NMAX = 200000;

int myHeap[(1 << LOGNMAX) + 1];
int pos[NMAX + 1], tm[NMAX + 1];

int lastNode;
inline void myswap(int &a, int &b);
inline void swapHeapElem(int a, int b);
inline int parent(int node);
inline int lSon(int node);
inline int rSon(int node);
inline int sift(int node);
inline int percolate(int node);
inline void del(int node);
inline int ins(int val, int t);


int main()
{
    FILE *fin = fopen("heapuri.in", "r");
    FILE *fout = fopen("heapuri.out", "w");
    int n, i, t = 0, act, val;
    fscanf(fin, "%d", &n);
    for (i = 0; i < n; i++)
    {
        fscanf(fin, "%d", &act);
        if (act == 1)
        {
            fscanf(fin, "%d", &val);
            ins(val, ++t);
        }
        else if (act == 2)
        {
            fscanf(fin, "%d", &val);
            del(pos[val]);
        }
        else
            fprintf(fout, "%d\n", myHeap[1]);
    }
    fclose(fin);
    fclose(fout);



    return 0;
}

inline void myswap(int &a, int &b)
{
    int aux = a;
    a = b;
    b = aux;
}
inline void swapHeapElem(int a, int b)
{
    myswap(myHeap[a], myHeap[b]);
    myswap(tm[a], tm[b]);
    myswap(pos[tm[a]], pos[tm[b]]);
}
inline int parent(int node) {return node >> 1;}
inline int lSon(int node) {return node << 1;}
inline int rSon(int node) {return (node << 1) + 1;}
inline int sift(int node)
{
    while (lSon(node) <= lastNode && (myHeap[node] > myHeap[lSon(node)] || myHeap[node] > myHeap[rSon(node)]))
    {
            if (myHeap[lSon(node)] < myHeap[rSon(node)])
            {
                swapHeapElem(lSon(node), node);
                node = lSon(node);
            }
            else
            {
                swapHeapElem(rSon(node), node);
                node = rSon(node);
            }
    }
        return node;
}
inline int percolate(int node)
{
    while (parent(node) && myHeap[node] < myHeap[parent(node)])
    {
        swapHeapElem(node, parent(node));
        node = parent(node);
    }
    return node;
}
inline void del(int node)
{
    swapHeapElem(node, lastNode--);
    if (myHeap[node] < myHeap[parent(node)])
        percolate(node);
    else
        sift(node);

}
inline int ins(int val, int t)
{
    myHeap[++lastNode] = val;
    pos[t] = lastNode;
    tm[lastNode] = t;
    percolate(lastNode);
}