Cod sursa(job #1337346)

Utilizator retrogradLucian Bicsi retrograd Data 8 februarie 2015 21:39:31
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<fstream>
#include<queue>
#include<map>

#define INF 100000001

using namespace std;

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

vector<int> INTRAT;
vector<int> POZ;
vector<int> HEAP;
vector<int> A;

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

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

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

void push(int val) {
    int i=A.size();
    A.push_back(val);
    HEAP.push_back(i);
    POZ.push_back(i);
    heapup(i);
}

void del(int i) {

    int poz = POZ[i];

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


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