Cod sursa(job #1987118)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 29 mai 2017 20:07:07
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <bits/stdc++.h>

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

const int NMax = (1 << 18) + 1;

int n,x,nr;

int a[NMax],poz[NMax];


struct node{
    int value;
    int time;
};

int Size;
node heap[NMax];

void go_up(int node){
    while(node > 1 && heap[node / 2].value > heap[node].value){
        swap(poz[heap[node].time],poz[heap[node / 2].time]);
        swap(heap[node],heap[node / 2]);
        node = node / 2;
    }
}
void go_down(int node){

    while((heap[2 * node].value < heap[node].value && 2 * node <= Size) || (heap[2 * node + 1].value < heap[node].value && 2 * node + 1 <= Size)){
        if(2 * node + 1 > Size){
            swap(poz[heap[node].time],poz[heap[2 * node].time]);
            swap(heap[node],heap[2 * node]);
            node = node * 2;
            continue;
        }else
        if(heap[2 * node].value < heap[2 * node + 1].value && 2 * node <= Size){
            swap(poz[heap[node].time],poz[heap[2 * node].time]);
            swap(heap[node],heap[2 * node]);
            node = node * 2;
        }else{
            swap(poz[heap[node].time],poz[heap[2 * node + 1].time]);
            swap(heap[node],heap[2 * node + 1]);
            node = node * 2 + 1;
        }
    }
}

void heap_insert(int x){
    heap[++Size].value = x;
    heap[Size].time = nr;
    poz[nr] = Size;///poz[i] - pozitia(nodul) elementului al i-lea adaugat
    go_up(Size);
}

void heap_erase(int node){
    swap(poz[heap[node].time],poz[heap[Size].time]);
    swap(heap[node],heap[Size]);
    Size--;
    go_down(node);
}
int main()
{
    f >> n;
    for(int i = 1; i <= n; ++i){
        f >> x;
        if(x == 1){
            f >> a[++nr];///al nr-lea element adaugat
            heap_insert(a[nr]);
        }else
        if(x == 2){
            int t;
            f >> t;
            heap_erase(poz[t]);///elimin nodul poz[t]
        }else
        if(x == 3){
            g << heap[1].value << '\n';
        }
    }
    return 0;
}