Cod sursa(job #1711479)

Utilizator liviu23Liviu Andrei liviu23 Data 31 mai 2016 13:17:42
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

struct nod {
    int val;
    int poz;
};

vector<nod> heap;
vector<int> pozitii;
int heapSize;

void insertToHeap(int nr) {
    int poz=heap.size();
    heap.push_back({nr,pozitii.size()});
    pozitii.push_back(poz);
    while(heap[poz].val<heap[poz/2].val&&poz>1) {
        swap(pozitii[heap[poz].poz],pozitii[heap[poz/2].poz]);
        swap(heap[poz],heap[poz/2]);
        poz=poz/2;
    }
}

void removeFromHeap(int nr) {
    int poz=pozitii[nr];
    swap(heap[poz],heap[heap.size()-1]);
    heap.pop_back();
    while(2*poz<heap.size()&&heap[poz].val>min(heap[2*poz].val,heap[2*poz+1].val)) {
        if(heap[2*poz].val<heap[2*poz+1].val||2*poz+1>=heap.size()) {
            swap(pozitii[heap[poz].poz],pozitii[heap[2*poz].poz]);
            swap(heap[poz],heap[2*poz]);
            poz=2*poz;
        }
        else if(heap[2*poz+1].val<heap[2*poz].val) {
            swap(pozitii[heap[poz].poz],pozitii[heap[2*poz+1].poz]);
            swap(heap[poz],heap[2*poz+1]);
            poz=2*poz+1;
        }
    }
}

int main()
{
    ifstream fin("heapuri.in");
    ofstream fout("heapuri.out");
    int n,op,nr;
    fin>>n;
    heap.push_back({0,0});
    pozitii.push_back(0);
    for(int i=1;i<=n;i++) {
        fin>>op;
        if(op==1) {
            fin>>nr;
            insertToHeap(nr);
        }
        else if(op==2) {
            fin>>nr;
            removeFromHeap(nr);
        }
        else
            fout<<heap[1].val<<'\n';
    }
    return 0;
}