Pagini recente » Cod sursa (job #2894078) | Cod sursa (job #722870) | Cod sursa (job #1126668) | Cod sursa (job #1236464) | Cod sursa (job #2906436)
// #include <iostream>
// #include <fstream>
// #include <unordered_map>
//
// using namespace std;
//
// int numar_cerinte;
// int H[1000000];
// int N;
// int tip;
// int pozitie_in_arbore[200001];
// unordered_map <int, int>m;
// int elem[100000000];
//
// int LeftChild(int k) {
// return 2 * k;
// }
//
// int RightChild(int k) {
// return 2 * k + 1;
// }
//
// int Father(int k) {
// return k / 2;
// }
//
// void Sift(int k) {
// int son = H[LeftChild(k)];
// while(son <= N && son) {
// if(RightChild(k) <= N && H[RightChild(k)] < H[son])
// son = H[RightChild(k)];
// if(H[son] > H[k])
// son = 0;
// else {
// swap(pozitie_in_arbore[m[H[son]]], pozitie_in_arbore[m[H[k]]]);
// swap(H[son], H[k]);
// }
// k = son;
// }
// }
//
// void Percolate(int k) {
// while(k > 1 && H[k] < H[Father(k)]) {
// swap(pozitie_in_arbore[m[H[k]]], pozitie_in_arbore[m[H[Father(k)]]]);
// swap(H[k], H[Father(k)]);
// k = Father(k);
// }
// }
//
// void AdaugareElement(int numar) {
// H[++N] = numar;
// elem[N] = numar;
// m[numar] = N;
// pozitie_in_arbore[N] = N;
// Percolate(N);
// }
//
// void EliminareElement(int k) {
// H[k] = H[N];
//
// N--;
// if(H[k] < H[Father(k)])
// Percolate(k);
// else
// Sift(k);
// }
//
// int Radacina() {
// return H[1];
// }
//
// void Citire() {
// ifstream f("date.in");
// f >> numar_cerinte;
//
// for(int i = 0; i < numar_cerinte; i++) {
// f >> tip;
// if(tip == 1) {
// int valoare;
// f >> valoare;
// AdaugareElement(valoare);
// // for(int i = 1; i <= N; i++)
// // cout << i << ' ' << pozitie_in_arbore[i] << "\n";
// // cout << "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n";
// continue;
// }
// if(tip == 2) {
// int x;
// f >> x;
// EliminareElement(pozitie_in_arbore[m[elem[x]]]);
// continue;
// }
// cout << Radacina() << " ";
// }
// }
//
// int main() {
// Citire();
// return 0;
// }
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
const int Nmax = 2e5 + 5;
int T, c, x, N, v;
int A[Nmax], H[Nmax], poz[Nmax];
void Percolate(int node)
{
while(node > 0 && A[H[node / 2]] > A[H[node]])
{
swap(H[node], H[node / 2]);
swap(poz[H[node]], poz[H[node / 2]]);
node /= 2;
}
}
void Sift(int node)
{
while(node <= N)
{
int Min = node, left = 2 * node, right = 2 * node + 1;
if (left <= N && A[H[left]] < A[H[Min]])
Min = left;
if (right <= N && A[H[right]] < A[H[Min]])
Min = right;
if (Min == node)
break;
swap(H[node], H[Min]);
swap(poz[H[node]], poz[H[Min]]);
node = Min;
}
}
void Add(int x)
{
A[++v] = x;
H[++N] = v;
poz[v] = N;
Percolate(N);
}
void Delete(int node)
{
if (node == N)
N--;
else
{
swap(H[node], H[N]);
swap(poz[H[node]], poz[H[N]]);
N--;
Sift(node);
Percolate(node);
}
}
int main()
{
in >> T;
while(T--)
{
in >> c;
if (c == 1)
{
in >> x;
Add(x);
}
else if (c == 2)
{
in >> x;
Delete(poz[x]);
}
else if (c == 3)
out << A[H[1]] << '\n';
}
return 0;
}