Cod sursa(job #1978701)

Utilizator MaligMamaliga cu smantana Malig Data 8 mai 2017 17:20:23
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include <iostream>
#include <fstream>
#include <deque>
#include <vector>
#include <queue>

using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");

#define pb push_back
#define ll long long
const int NMax = 5e5 + 5;
const int inf = 1e9 + 5;

int M,N,nrInsert;
int idx[NMax];

struct elem {
    int val,ord;
    elem (int _val = 0,int _ord = 0) {
        val = _val;
        ord = _ord;
    }
} v[NMax];

void sift(int);
void percolate(int);
void swap_heap(elem&,elem&);

int main() {
    in>>M;

    N = nrInsert = 0;
    while (M--) {
        int tip,x;

        in>>tip;
        switch (tip) {
        case 1: {
            in>>x;

            v[++N] = elem(x,++nrInsert);
            idx[nrInsert] = N;
            percolate(N);

            break;
        }
        case 2: {
            in>>x;

            int pos = idx[x];
            swap_heap(v[pos],v[N]);
            N--;

            if (pos != 1 && v[pos].val < v[pos/2].val) {
                percolate(pos);
            }
            else {
                sift(pos);
            }

            break;
        }
        default: {
            out<<v[1].val<<'\n';
        }
        }

        /*
        for (int i=1;i <= N;++i) {
            cout<<i<<' '<<v[i].val<<' '<<v[i].ord<<' '<<idx[i]<<'\n';
        }
        cout<<'\n';
        //*/
    }

    in.close();out.close();
    return 0;
}

void percolate(int node) {

    int dad = node/2;
    while (node != 1 && v[node].val < v[dad].val) {
        swap_heap(v[node],v[dad]);
        node = dad;

        dad = node/2;
    }
}

void sift(int node) {

    int son = 0;
    do {
        son = 0;
        int fs = 2*node,
            ss = 2*node + 1;
        if (fs <= N) {
            son = fs;
            if (ss <= N && v[ss].val < v[son].val) {
                son = ss;
            }
        }

        if (son && v[son].val < v[node].val) {
            swap_heap(v[son],v[node]);
            node = son;
        }
        else {
            son = 0;
        }
    }
    while (son);
}

void swap_heap(elem &a,elem &b) {
    swap(idx[a.ord],idx[b.ord]);
    swap(a,b);
}