Cod sursa(job #1042081)

Utilizator CaligulaGAIVS IVLIVS CAESAR AVGVSTVS GERMANICVS Caligula Data 26 noiembrie 2013 16:16:46
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include<cstdio>
#include<cstring>
using namespace std;
int m,n,t,x,nr,a[200005],v[200005],w[200005];
void interschimba(int poz1, int poz2)
{
    int aux=w[poz1]; w[poz1]=w[poz2], w[poz2]=aux;
    aux=a[poz1], a[poz1]=a[poz2], a[poz2]=aux;
    aux=v[w[poz1]], v[w[poz1]]=v[w[poz2]], v[w[poz2]]=aux;
}
void reconstituie_heap(int s, int lung)
{
    int minim=s;
    if (2*s<=lung && a[minim]>a[2*s]) minim=2*s;
    if (2*s+1<=lung && a[minim]>a[2*s+1]) minim=2*s+1;
    if (minim!=s)
    {
        interschimba(s,minim);
        reconstituie_heap(minim,lung);
    }
}
void construieste_heap(int lung)
{
    int i;
    for (i=lung/2;i;--i)
        reconstituie_heap(i,lung);
}
int cauta(int val)
{
    int i;
    for (i=1;i<=n;++i)
        if (w[i]==val) return i;
    return 0;
}
int main()
{
    int i;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&m);
    for (i=0;i<m;++i)
    {
        scanf("%d",&t);
        if (t==3)
        {
            construieste_heap(n);
            printf("%d\n",a[1]);
        }
        else
        {
            scanf("%d",&x);
            if (t==1)
            {
                a[++n]=x, w[++nr]=n, v[n]=nr;
            }
            else
            {
                interschimba(v[x],n);
                --n;
            }
        }
    }
    return 0;
}