Cod sursa(job #3163343)

Utilizator Nasa1004Ema Nicole Gheorghe Nasa1004 Data 31 octombrie 2023 12:07:54
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <fstream>

using namespace std;
const int NMAX = 200002;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

pair < int, int > heap[4 * NMAX];
int f[NMAX];
int hsize = 0;

void up(int val)
{
    while(val > 1)
    {
        if(heap[val].first < heap[val / 2].first)
        {
            swap(f[heap[val].second], f[heap[val / 2].second]);
            swap(heap[val].first, heap[val / 2].first);
            swap(heap[val].second, heap[val / 2].second);
            val /= 2;
        }
        else
            break;
    }
}
void down(int val)
{
    while(val * 2 <= hsize)
    {
        int x = val * 2;
        if(x < hsize && heap[x].first > heap[x + 1].first)
            x++;

        if(heap[val].first > heap[x].first)
        {
            swap(f[heap[val].second], f[heap[x].second]);
            swap(heap[val].first, heap[x].first);
            swap(heap[val].second, heap[x].second);
            val = x;
        }
        else
            break;
    }
}

int main()
{
    int n, ok, a, poz = 0;
    fin >> n;
    while(n--)
    {
        fin >> ok;
        if(ok == 1) ///inserez
        {
            fin >> a;
            poz++;
            heap[++hsize].first = a;
            heap[hsize].second = poz;
            f[poz] = hsize;

            up(hsize);
        }
        else if(ok == 2) ///sterg
        {
            fin >> a;
            int val = f[a];

            swap(f[heap[val].second], f[heap[hsize].second]);
            swap(heap[val].first, heap[hsize].first); ///le dam swap
            swap(heap[val].second, heap[hsize].second);

            f[heap[hsize].second] = 0;
            heap[hsize].first = 0;
            heap[hsize].second = 0;
            hsize--;

            //cout << "heapuri --> " << heap[1].first << " " << heap[2].first << " " << heap[3].first << '\n';
            //cout << "size --> " << hsize << '\n';

            if (val <= hsize) {
                down(val);
                up(val);
            }
        }
        else
            fout << heap[1].first << '\n';
    }
    return 0;
}