Cod sursa(job #453050)

Utilizator idomiralinIdomir Alin idomiralin Data 10 mai 2010 22:09:57
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include<stdlib.h>
#include<cstdio>
#include<algorithm>

using namespace std;

int h[200005],n,poz[200005],ind[200005],a[200005];
int tata(int nod)
{
    return nod / 2;
}
int fiust(int nod)
{
    return nod * 2;
}
int fiudr(int nod)
{
    return nod * 2 + 1;
}
int min()
{
    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 && a[h[fiust(k)]] > a[h[fiudr(k)]])
            son = fiudr(k);
            }
         if (a[h[son]] >= a[h[k]]) son = 0;
     
     if (son)
     {
             poz[h[son]] = k;
             poz[h[k]] = son;
             swap(h[k],h[son]);
             k = son;
             
             }
     }while (son);
}
            
void perc( int k)
{int key;
     key = h[k];
     while (k > 1 && a[key] < a[h[tata(k)]])
     {
           h[k] = h[tata(k)];
           poz[h[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];
     poz[h[n]] = k;
     --n;
     
     if (k > 1 && a[h[k]] < a[h[tata(k)]])  perc(k);
                       else        sift(k);
                       
     }

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