Cod sursa(job #857126)

Utilizator cremarencodianaCremarenco Diana cremarencodiana Data 17 ianuarie 2013 13:14:21
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <stdio.h>

using namespace std;
int h[200010],op,i,n,y,x,j,v[200010],s,z;
void heapup(int k)
{
    if (k<2) return;
    int t=k/2;
    if (h[t]>h[k])
    {
        int x;
        x=h[t]; h[t]=h[k]; h[k]=x;
        heapup(t);
    }
}

void heapdw(int k, int n)
{
    int st,dr,i;
    if (k>=n) return;
    if (2*k<=n) st=2*k; else return;
    if (2*k+1<=n) dr=2*k+1; else dr=200010;
    if (h[st]<h[dr] || dr==200010)
    {
        x=h[st]; h[st]=h[k]; h[k]=x;
        heapdw(st,n);
    }
    else
    if (dr!=200010)
    {
        x=h[dr]; h[dr]=h[k]; h[k]=x;
        heapdw(dr,n);
    }
}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d\n",&s);
    for (i=1; i<=s; i++)
    {
        scanf("%d",&op);
        if (op==3) printf("%d\n",h[1]);
        else
        if (op==1)
        {
            scanf("%d\n",&x);
            n++;
            h[n]=x;
            v[n]=x;
            heapup(n);
        }
        else
        {
            scanf("%d\n",&x);
            for (j=1; j<=n; j++)
             if (h[j]==v[x]) {y=j; break;}
            z=h[y]; h[y]=h[n]; h[n]=z;
            n--;
            heapdw(y,n);
        }
    }
    return 0;
}