Cod sursa(job #1260779)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 11 noiembrie 2014 16:24:43
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#define NMax 200001
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n, op, H[NMax], i, j, ord[NMax], v[NMax], p[NMax], k;
inline int left_son(int nod)
{
    return 2*nod;
}
inline int right_son(int nod)
{
    return 2*nod+1;
}
inline int father(int nod)
{
    return nod/2;
}
void inters(int nod1, int nod2)
{
    swap (H[nod1], H[nod2]);
    swap (p[H[nod1]], p[H[nod2]]);
}
void sus(int nod)
{
    while (nod>1 && v[H[nod]] < v[H[father(nod)]]) {
        inters(nod, father(nod));
        nod=father(nod);
    }
}
void jos(int nod)
{
    int st=left_son(nod), dr=0;;
    while (st<=k) {
        int Max=nod;
        if (v[H[st]] < v[H[Max]])
            Max=st;
        dr=right_son(nod);
        if (dr<=k && v[H[dr]] < v[H[Max]])
            Max=dr;
        if (Max!=nod) {
            inters (nod, Max);
            nod=Max;
            st=left_son(nod);
        }
        else
            return;
    }
}
void sterge(int nod)
{
    if (father(nod) >= 1 && v[H[nod]]<v[H[father(nod)]])
        sus(nod);
    else
        jos(nod);
}
int main()
{ int nr=0;
    f>>n;
    for (i=1; i<=n; i++) {
        f>>op;
        if (op==1) {
            f>>v[++nr];
            k++;
            H[k]=nr;
            p[nr]=k;
            sus (k);
        }
        else if (op==2) {
            int no;
            f>>no;
            H[p[no]]=H[k];
            p[H[k]]=p[no];
            k--;
            sterge (p[no]);
        }
        else
            g<<v[H[1]]<<"\n";
    }
    return 0;
}