Pagini recente » Cod sursa (job #1977164) | Cod sursa (job #2972769) | Cod sursa (job #3120506) | Cod sursa (job #978300) | Cod sursa (job #1018025)
#include<iostream>
using namespace std;
int cron[200000], heap[200000], poz[200000], nrElem, nrHeap;
void swap(int &a, int &b) {
int aux = a;
a = b;
b = aux;
}
void insert(int x) {
nrElem++;
nrHeap++;
cron[nrElem] = x;
heap[nrHeap] = nrElem;
poz[nrHeap] = nrElem;
int i = nrElem;
while(i >= 1 && cron[heap[i]] < cron[heap[i / 2]]) {
// elementul e mai mare decat parintele sau
swap(heap[i], heap[i / 2]);
poz[heap[i]] = i;
poz[heap[i/2]] = i/2;
i /= 2;
}
}
void delete_heap(int x) {
swap(heap[poz[x]], heap[nrHeap]);
poz[heap[x]] = x;
nrHeap--;
int parent = poz[x];
int left = 2 * parent, right = 2 * parent + 1;
while(left <= nrHeap) {
// choose the minimum child
int child = left;
if(right <= nrHeap && cron[heap[right]] < cron[heap[left]]) {
child = right;
}
if(cron[heap[child]] < cron[heap[parent]]) {
swap(heap[parent], heap[child]);
poz[heap[parent]] = parent;
poz[heap[child]] = child;
parent = child;
left = parent * 2;
right = parent * 2 + 1;
} else {
left = nrElem + 1;
}
}
}
void printMin() {
cout << cron[heap[1]] << '\n';
}
void printHeap() {
int i;
for(i = 1; i <= nrHeap; i++) {
cout << cron[heap[i]] << " ";
}
cout << endl;
}
int main() {
int i, n, opt, x;
cin >> n;
for(i = 0; i < n; i++) {
cin >> opt;
if(opt == 1) {
cin >> x;
insert(x);
// printHeap();
}
if(opt == 2) {
cin >> x;
delete_heap(x);
// printHeap();
}
if(opt == 3) {
printMin();
}
}
}