Pagini recente » Cod sursa (job #1297896) | Cod sursa (job #1325340) | Cod sursa (job #1131495) | Monitorul de evaluare | Cod sursa (job #1862336)
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int vec[200005], n; // vector cu numere si contorul de numere
int Heap[200005], l;// heap-ul in care tin pozitiile numerelor din vec[], dar si numarul de elemente
int poz[200005]; // pozitia in heap a indicilor numerelor din vec[]
int i, j, x, y, o,q;
void urc(int x) {
while (x/2 && vec[Heap[x]] < vec[Heap[x/2]]) {
swap(Heap[x], Heap[x/2]);
poz[Heap[x]] = x;
poz[Heap[x/2]] = x/2;
x /= 2;
}
}
void cobor(int x) {
int y;
while (x != y) {
y = x;
if(vec[Heap[2*y]] < vec[Heap[x]] && 2*y <= l)
x = 2*x;
else if (vec[Heap[2*y+1]] < vec[Heap[x]] && 2*y+1 <= l)
x = 2*y+1;
swap(Heap[x], Heap[y]);
poz[Heap[x]] = x;
poz[Heap[y]] = y;
}
}
void adaug(int x) {
l++, n++;
vec[n] = x;
poz[n] = l;
Heap[l] = n;
urc(l);
}
void scot(int x) {
vec[x] = -1; // pune -1 in locul numarului scos, ca sa aiba pozitia 1
urc(poz[x]); // in heap dupa ce il ridica
poz[Heap[1]] = 0; // numarul scos are pozitia 0 in heap, deci ca si inexistent
Heap[1] = Heap[l]; // ultimul element din heap il pun in varf
l--;
poz[Heap[1]] = 1; // si ii aloc pozitia 1
if (l > 1) // dupa care il cobor in heap
cobor(1);
}
int main() {
f >> o;
while (o--) {
f >> q;
if (q < 3) {
f >> x;
if (q == 1)
adaug(x);
else scot(x);
}
else
g << vec[Heap[1]] << '\n';
}
return 0;
}