Cod sursa(job #3120877)

Utilizator unomMirel Costel unom Data 9 aprilie 2023 01:06:25
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>

using namespace std;

ifstream f("heapuri.in");
ofstream g("heapuri.out");
int v[200005];
int el[200005];
int m, n = 0;
int ind = 0;

int promote(int x)
{
    int heap = 0;
    while(x > 1 && !heap)
    {
        if(v[x] >= v[x/2])
        {
            heap = 1;
            return x;
        }
        else
        {
            swap(v[x], v[x/2]);
            x /= 2;
        }
    }
}

void sift(int x)
{
    int heap = 0;
    int p;
    while(2*x <= n && !heap)
    {
        p = 2 * x;
        if(p+1 <= n && v[p] > v[p+1])
        {
            p++;
        }

        if(v[x] <= v[p])
        {
            heap = 1;
        }
        else
        {
            swap(v[x], v[p]);
            x = p;
        }
    }
}

int main()
{
    f>>m;
    int x, c;
    while(m--)
    {
        f>>c;
        if(c == 1)
        {
            f>>x;
            n++;
            v[n] = x;
            ind++;
            el[ind] = x;
            promote(n);
        }
        else if(c == 2)
        {
            f>>x;
            int r;
            for(int i = 1; i<=n ;i++)
            {
                if(v[i] == el[x])
                {
                    r = i;
                    break;
                }
            }
            swap(v[r], v[n]);
            n--;
            r = promote(r);
            sift(r);
        }
        else
        {
            g<<v[1]<<'\n';
        }
    }
    return 0;
}