Pagini recente » Cod sursa (job #1011129) | Cod sursa (job #46409) | Cod sursa (job #1349436) | Cod sursa (job #1026018) | Cod sursa (job #2575295)
#include <fstream>
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");
const int N = 2e5 + 5;
int k, T;
bool f[N];
struct nod {
int val, timp; ///valoarea, timpul la care a fost adaugat in heap
} v[N];
void adaug(int x, int timp) {
v[++k].val = x;
v[k].timp = timp;
int aux = k;
while (aux > 1 && v[aux].val < v[aux / 2].val) {
swap(v[aux], v[aux / 2]);
aux /= 2;
}
}
void sterg(int p) {
v[p] = v[k];
v[k] = {0, 0};
--k;
int aux = p;
while (aux * 2 <= k && (v[aux].val > v[aux * 2].val || v[aux].val > v[aux * 2 + 1].val)) {
if (v[aux * 2].val > v[aux * 2 + 1].val && aux * 2 + 1 <= k) {
swap(v[aux], v[aux * 2 + 1]);
aux = aux * 2 + 1;
} else if (v[aux * 2].val < v[aux].val) {
swap(v[aux], v[aux * 2]);
aux = aux * 2;
} else
break;
}
}
int main() {
int n, tip, x;
fin >> n;
for (int i = 1; i <= n; ++i) {
fin >> tip;
switch(tip) {
case 1 :
fin >> x;
adaug(x, ++T);
break;
case 2 :
fin >> x;
f[x] = true;
break;
case 3 :
while (f[v[1].timp])
sterg(1);
fout << v[1].val << '\n';
break;
}
}
return 0;
}