Cod sursa(job #2906436)

Utilizator MoarcascosminMoarcas Cosmin Moarcascosmin Data 26 mai 2022 01:45:13
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.54 kb
// #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;
}