Cod sursa(job #1733282)

Utilizator xSliveSergiu xSlive Data 24 iulie 2016 12:44:38
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <math.h>

#include <unordered_map>
#define INPUT "heapuri.in"
#define OUTPUT "heapuri.out"
#define NMAX 200010
using namespace std;
ifstream f(INPUT);
ofstream g(OUTPUT);

int v[NMAX],v_size,n;
unordered_map <int,int> pozEl;

int cron[NMAX],cron_size,op,op1;

inline int father(int el){return el/2;}
inline int leftSon(int el){return 2*el;}
inline int rightSon(int el){return 2*el+1;}

void urca(int i){
    int el;
    for(el=v[i];i>1 && v[father(i)] > el;){
        v[i]=v[father(i)];
        pozEl[v[i]]=i;
        i=father(i);
    }
    v[i]=el;
    pozEl[v[i]]=i;
}

void coboara(int i){
    int son;
    do{
        son=0;
        if(leftSon(i) <= v_size){
            son = leftSon(i);
            if(rightSon(i) <= v_size && v[rightSon(i)] < v[son])
                son=rightSon(i);
            if(v[i] < v[son])
                son=0;
        }
        if(son){
            swap(v[i],v[son]);
            pozEl[v[i]]=i;
            pozEl[v[son]] = son;
            i=son;
        }
    }while(son);
}

void adauga(int el){
    v[++v_size] = el;
    cron[++cron_size]=el;
    urca(v_size);

}

void stergePoz(int i){
    swap(v[v_size--],v[i]);
    if(father(i)>=1 && v[father(i)] > v[i])
        urca(i);
    else coboara(i);
}

void stergeCron(int poz){
    stergePoz(pozEl[cron[poz]]);
}

int main(){
    f >> n;
    for(int i=1;i<=n;i++){
        f >> op;
        if(op == 1){
            f >> op1;
            adauga(op1);
        }
        else if(op == 2){
            f >> op1;
            stergeCron(op1);
        }
        else g << v[1] << '\n';
    }
    return 0;
}