Cod sursa(job #452481)

Utilizator idomiralinIdomir Alin idomiralin Data 10 mai 2010 15:46:04
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#include<stdlib.h>
#include<cstdio>
#include<algorithm>

using namespace std;

int h[100],n,poz[100],ind[100],a[100];
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]);
             poz[h[son]] = k;
             k = son;
             poz[h[k]] = k;
             
             }
     }while (son);
}
            
void perc( int k)
{int key;
     key = h[k];
     while (k > 1 && key < h[tata(k)])
     {
           h[k] = h[tata(k)];
           poz[tata(k)] = k;
           k = tata(k);
           }
     h[k] = key;
     poz[key] = k; 
     
     }

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 = 0;
    scanf("%d",&m);
    for (i = 1; i <= m; i++)
    {
        x = 0;
        scanf("%d",&x);
    if (x == 1) { scanf("%d",&y);
                  ct++;
                  a[ct] = y;
                  poz[a[ct]] = ct; 
                  ins(y);          
                  }
    if (x == 2) { scanf("%d",&y);
                  /*for (i = 1; i <= n; i++)
                  if (h[i] == a[y]) {poz = i;break;}*/
                  elimin(poz[a[y]]);
                  }
    if (x == 3)  {printf("%d ",max());
                  printf("\n");}
    }
return 0;
}