Cod sursa(job #1320164)

Utilizator retrogradLucian Bicsi retrograd Data 17 ianuarie 2015 17:43:19
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<fstream>
#include<queue>
#include<map>

#define INF 100000001

using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

vector<int> INTRAT;
int POZ[1000];
vector<int> HEAP;

void heapup(int poz) {
    while(HEAP[poz] < HEAP[poz / 2]) {
        swap(HEAP[poz], HEAP[poz / 2]);
        swap(POZ[HEAP[poz]], POZ[HEAP[poz / 2]]);
        poz /= 2;
    }
}

int nextp;
void heapdown(int poz) {
    while(true) {
        if(poz*2 >= HEAP.size()) return;
        else if(poz*2+1 >= HEAP.size() || HEAP[poz*2] < HEAP[poz*2+1]) nextp = poz*2;
        else nextp = poz*2+1;
        if(HEAP[nextp] == INF) return;

        swap(HEAP[poz], HEAP[nextp]);
        POZ[HEAP[poz]] = poz;
        poz = nextp;
    }
}

void push(int val) {
    HEAP.push_back(val);
    POZ[val] = HEAP.size() - 1;
    INTRAT.push_back(val);
    heapup(HEAP.size() - 1);
}

void del(int i) {
    int val = INTRAT[i];
    int poz = POZ[val];

    HEAP[poz] = INF;
    heapdown(poz);
}


int main() {
    int T, type, val;
    INTRAT.push_back(0);
    HEAP.push_back(-INF);
    fin>>T;
    while(T--) {
        fin>>type;
        if(type == 3) {
            fout<<HEAP[1]<<"\n";
            continue;
        }
        fin>>val;
        switch(type) {
            case 1: push(val);break;
            case 2: del(val);break;
        }
    }
    return 0;
}