Cod sursa(job #448922)

Utilizator idomiralinIdomir Alin idomiralin Data 4 mai 2010 23:12:41
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include<stdlib.h>
#include<cstdio>
#include<algorithm>

using namespace std;

int h[10000],n,poz[1000];
int tata(int nod)
{
    return nod / 2;
}
int fiust(int nod)
{
    return nod * 2;
}
int fiudr(int nod)
{
    return nod * 2 + 1;
}
int max()
{
    return h[1];
}

void swap(int &x, int &y)
{int aux;
     aux = x; 
     x = y;
     y = aux;
     }
void sift( int k)
{int son;
     do
     {
         son = 0;
         if (fiust(k) <= n)
         {
            son = fiust(k);
            if (fiudr(k) <= n && h[fiust(k)] > h[fiudr(k)])
            son = fiudr(k);
            }
         if (h[son] > h[k]) son = 0;
     
     if (son)
     {
             swap(h[k],h[son]);
             k = son;
             }
     }while (son);
}
            
void perc( int k)
{int key;
     key = h[k];
     while (k > 1 && key < h[tata(k)])
     {
           h[k] = h[tata(k)];
           k = tata(k);
           }
     h[k] = key;
     
     }

void buildheap()
{
     for (int i = n / 2; i > 0; i--)
     sift(i);
}

void elimin( int k)
{
     h[k] = h[n];
     --n;
     
     if (k > 1 && h[k] < h[tata(k)])  perc(k);
                       else        sift(k);
                       
     }

void ins( int k)
{
     h[++n] = k;
     perc(n);
     }

int main()
{int ct;
    int x,y,i,m;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    
    ct = 1;
    scanf("%d",&m);
    for (i = 1; i <= m; i++)
    {
        scanf("%d",&x);
    if (x == 1) { scanf("%d",&y);
                  poz[y] = ct++;
                  ins(y);
                  
                  }
    if (x == 2) { scanf("%d",&y);
                  elimin(poz[y]);
                  }
    if (x == 3)  printf("%d ",max());
    }
return 0;
}