Pagini recente » Cod sursa (job #2146692) | Cod sursa (job #2738676) | Cod sursa (job #1154201) | Cod sursa (job #2284638) | Cod sursa (job #3169050)
#include <iostream>
#include <fstream>
#define N_MAX 200010
using namespace std;
ifstream in ("heapuri.in");
ofstream out ("heapuri.out");
int n, sizeHeap, contor, timeAdded[N_MAX];
pair <int, int> heap[N_MAX];
inline int indexLeftChild (int i) { return i*2; }
inline int indexRightChild (int i) { return i*2 + 1; }
inline int indexParent (int i) { return i/2; }
void upHeap (int x){
while (x >= 1 && heap[x].first < heap[indexParent(x)].first){
swap (heap[x], heap[indexParent(x)]);
timeAdded[heap[x].second] = x;
timeAdded[heap[indexParent(x)].second] = indexParent(x);
x = indexParent(x);
}
}
void downHeap (int x){
int right = indexRightChild(x), left = indexLeftChild(x), smaller;
smaller = x;
if (left <= sizeHeap && heap[left].first < heap[smaller].first)
smaller = left;
if (right <= sizeHeap && heap[right].first < heap[smaller].first)
smaller = right;
if (smaller != x){
swap (heap[x], heap[smaller]);
timeAdded[heap[x].second] = x;
timeAdded[heap[smaller].second] = smaller;
downHeap (smaller);
}
}
void add (int x){
heap[++sizeHeap].first = x;
contor++;
timeAdded[contor] = contor; // indicele la care se alfa in heap
heap[sizeHeap].second = sizeHeap;
upHeap(sizeHeap);
}
void deleteElement (int x){
swap (heap[sizeHeap], heap[timeAdded[x]]);
sizeHeap--;
downHeap (timeAdded[x]);
}
int main () {
in >> n;
int operation, value;
for (int i=1; i<=n; i++){
in >> operation;
if (operation == 1){
in >> value;
add(value);
}
else if (operation == 2){
in >> value;
deleteElement(value);
}
else
out << heap[1].first << '\n';
}
return 0;
}