Cod sursa(job #1869890)

Utilizator BlackNestaAndrei Manaila BlackNesta Data 6 februarie 2017 11:16:57
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("heapuri.in");
ofstream g("heapuri.out");

const int Nmax = 200050;
int N, a[Nmax], poz[Nmax], p;

void Push(int x)
{
    int k, tata;
    a[++N] = x;
    poz[N] = p;
    k = N;
    while(k > 1)
    {
        tata = k / 2;
        if(a[k] >= a[tata])
            return;
        swap(a[k], a[tata]);
        swap(poz[k], poz[tata]);
        k = tata;
    }
}

void Pop(int k)
{
    int fiu;
    a[k] = a[N];
    poz[k] = poz[N];
    N--;
    while(2 * k <= N)
    {
        fiu = 2 * k;
        if(fiu + 1 <= N && a[fiu] > a[fiu + 1])
            fiu++;
        if(a[k] <= a[fiu]) return;
        swap(a[k], a[fiu]);
        swap(poz[k], poz[fiu]);
        k = fiu;
    }
}

int main()
{
    int i, op, x, m, pozitie, j;
    f >> m;
    for(i = 1; i <= m; i++)
    {
        f >> op;
        if(op == 1)
        {
            f >> x;
            p++;
            Push(x);
        }
        else if(op == 2)
        {
            f >> x;
            pozitie = -1;
            for(j = 1; j <= N && pozitie == -1; j++)
                if(poz[j] == x) pozitie = j;
            Pop(pozitie);
        }
        else if(op == 3) g << a[1] << "\n";
    }
    return 0;
}