Cod sursa(job #1590795)

Utilizator BrandonChris Luntraru Brandon Data 5 februarie 2016 16:06:38
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>

#define INF 1000005

using namespace std;

ifstream cin ("heapuri.in");
ofstream cout ("heapuri.out");

int heap[200005], heap_size, order[200005], op, op_nr, order_size;

void insert_node(int node_val) {
    int pos_val, curr_pos;
    ++heap_size;
    heap[heap_size] = node_val;
    pos_val = heap_size;
    curr_pos = heap_size;
    while(curr_pos >= 1) {
        if(heap[pos_val] <= heap[curr_pos]) {
            swap(heap[pos_val], heap[curr_pos]);
        }
        pos_val = curr_pos;
        curr_pos /= 2;
    }
}

void remove_node(int node_val) {
    int pos, curr_pos;
    for(int i = 1; i <= heap_size; ++i) {
        if(heap[i] == node_val) {
            heap[i] = INF;
            pos = i;
            break;
        }
    }
    curr_pos = pos + 1;
    while(curr_pos <= heap_size + 1) {
        if(heap[pos] > heap[curr_pos] ) {
            if(heap[curr_pos] > heap[curr_pos + 1] and curr_pos < heap_size) {
                if(heap[pos] > heap[curr_pos + 1]) {
                    ++curr_pos;
                }
            }
            swap(heap[pos], heap[curr_pos]);
            pos = curr_pos;
        }
        curr_pos *= 2;
    }
    --heap_size;
}

void read() {
    cin >> op_nr;
    for(int i = 1; i <= op_nr; ++i) {
        cin >> op;
        if(op == 1) {
            int node_val;
            cin >> node_val;
            insert_node(node_val);
            ++order_size;
            order[order_size] = node_val;
        }
        if(op == 2) {
            int node_order;
            cin >> node_order;
            remove_node(order[node_order]);
        }
        if(op == 3) {
            cout << heap[1] << '\n';
        }
    }
}

int main() {
    read();
    return 0;
}