Cod sursa(job #1941319)

Utilizator RaduToporanRadu Toporan RaduToporan Data 27 martie 2017 10:27:55
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <cstdio>

using namespace std;
int k,n,i,cod,x,poz;
struct element
{
    int elem,poz;
} v[200005];
bool viz[200005];

void adaugare(int x, int poz)
{
    k++;
    v[k].elem=x;
    v[k].poz=poz;
    poz=k;
    viz[poz]=1;
    while (v[poz].elem<v[poz/2].elem)
    {
        swap(v[poz],v[poz/2]);
        poz=poz/2;
    }
}

void stergere()
{
    swap(v[1],v[k]);
    k--;
    int poz=1;
    while ((v[poz].elem>v[poz*2].elem&&poz*2<=k) or (v[poz].elem>v[poz*2+1].elem&&poz*2+1<=k))
        if (v[poz*2].elem>v[poz*2+1].elem && poz*2<=k)
        {
            swap(v[poz],v[poz*2+1]);
            poz=poz*2+1;
        }
        else
        {
            swap(v[poz],v[poz*2]);
            poz=poz*2;
        }
}

void afisare()
{
    int poz=1;
    bool gasit=false;
    while (gasit==false)
        if (viz[v[poz].poz]==1)
        {
            printf("%d\n",v[poz].elem);
            gasit=true;
        }
        else stergere();
}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    for (i=1; i<=n; i++)
    {
        scanf("%d",&cod);
        if (cod!=3) scanf("%d",&x);
        if (cod==1)
            adaugare(x,++poz);
        else if (cod==2)
            viz[x]=0;
            else afisare();
    }
    return 0;
}