Cod sursa(job #402191)

Utilizator preda_alexandruPreda Alexandru preda_alexandru Data 23 februarie 2010 16:44:24
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include<stdio.h>

int h[200001],v[200001],ord[200001],c,n,m;

void sift(int k)
{
int min,poz,aux;
while(2*k<=m){
             min=v[h[2*k]];
             poz=2*k;
             if(2*k+1<=m && v[h[2*k+1]]<min){
                                            min=v[h[2*k+1]];
                                            poz=2*k+1;
                                            }
             if(v[h[k]]>v[h[poz]]){
                                  aux=h[k];
                                  h[k]=h[poz];
                                  h[poz]=aux;
                                  ord[h[poz]]=poz;
                                  ord[h[k]]=k;             
                                  }
             else break;
             k=poz;
             }
}

void percolate(int k)
{
int aux;
while(k>1 && v[h[k]]<v[h[k/2]]){
                               aux=h[k];
                               h[k]=h[k/2];
                               h[k/2]=aux;
                               ord[h[k]]=k;
                               ord[h[k/2]]=k/2;
                               k=k/2;
                               }    
}

int main()
{
int i,j,x,o;
FILE *fin=fopen("heapuri.in", "r");
FILE *fout=fopen("heapuri.out", "w");
fscanf(fin,"%d",&n);
for(i=1;i<=n;i++){
                 fscanf(fin,"%d",&o);;
                 if(o==1){
                         fscanf(fin,"%d",&x);;
                         c++;
                         m++;
                         v[c]=x;
                         ord[c]=m;
                         h[m]=c;
                         for(j=n/2;j>=1;j--)sift(j);
                         }
                 else if(o==2){
                              fscanf(fin,"%d",&x);;
                              h[ord[x]]=h[m--];
                              if(x>1 && v[h[x]]<v[h[x/2]])percolate(ord[x]);
                              else sift(ord[x]);
                              }
                      else fprintf(fout,"%d\n",v[h[1]]);
                 }
return 0;
}