Pagini recente » Cod sursa (job #1506419) | Monitorul de evaluare | Cod sursa (job #130301) | Cod sursa (job #562113) | Cod sursa (job #3169039)
#include <iostream>
#include <fstream>
#define N_MAX 200005
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 (right <= sizeHeap && heap[right].first < heap[smaller].first)
smaller = right;
if (left <= sizeHeap && heap[left].first < heap[smaller].first)
smaller = left;
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 = contor;
upHeap(sizeHeap);
// for (int i=1; i<=sizeHeap; ++i)
// cout << heap[i].first << ' ';
// cout << '\n';
// for (int i=1; i<=sizeHeap; ++i)
// cout << timeAdded[i] << ' ';
// cout << '\n';
}
void deleteElement (int x){
swap (heap[sizeHeap], heap[timeAdded[x]]);
sizeHeap--;
downHeap (timeAdded[x]);
// for (int i=1; i<=sizeHeap; ++i){
// cout << heap[i].first << ' ';
// }
// cout << '\n';
// for (int i=1; i<=sizeHeap; ++i)
// cout << timeAdded[i] << ' ';
// cout << '\n';
}
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;
}