Cod sursa(job #1770402)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 4 octombrie 2016 11:06:53
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>

#define NMax 200001
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");

vector<int> heap;
int n,p,x,nr;
int node[NMax],order[NMax];

void add(vector<int> &heap, int x){
    heap.push_back(x);
    int i = heap.size() - 1;
    while(heap[(i - 1) / 2] > heap[i] && i > 0){
        swap(heap[(i - 1) / 2], heap[i]);

        node[order[i]] = (i - 1) / 2;
        node[order[(i - 1) / 2]] = i;
        swap(order[i],order[(i - 1) / 2]);

        i = (i - 1) / 2;
    }
}
void del(vector<int> &heap, int x){
    swap(heap[x],heap[heap.size() - 1]);
    heap.pop_back();
    int n = heap.size();
    int i = x;
    while(i < n){
        int son = -1;
        if(heap[2 * i + 1] < heap[i] && 2 * i + 1 < n){
            son = 2 * i + 1;
        }
        if(heap[2 * i + 2] < heap[i] && 2 * i + 2 < n){
            if(son == -1)
                son = 2 * i + 2;
            else
                if(heap[2 * i + 2] < heap[2 * i + 1])
                    son = 2 * i + 2;
        }
        if(son == -1)
            break;
        swap(heap[i], heap[son]);

        node[order[i]] = son;
        node[order[son]] = i;
        swap(order[i],order[son]);

        i = son;
    }
}
int main()
{
    f >> n;
    for(int i = 1; i <= n; ++i){
        f >> p;
        if(p == 1){
            f >> x;

            node[nr] = heap.size();
            order[heap.size()] = nr;
            ++nr;

            add(heap,x);
        }
        if(p == 2){
            f >> x;
            del(heap,node[x - 1]);
        }
        if(p == 3){
            g << heap[0] << '\n';
        }
    }
    return 0;
}