Cod sursa(job #306615)

Utilizator adrianraduleaRadulea Adrian adrianradulea Data 21 aprilie 2009 17:10:00
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<stdio.h>
FILE *f,*g;
long val[200000],poz[200000],H[200000],aux,ok,x,n,a,b,minim,nr,op,o,semn;
long min(long a,long b)
{ if(a>b) return a; return b; }
void percolate(long x)
{ while(val[H[x]]<val[H[x/2]]&&x>1)
   { if(val[H[x]]<val[H[x/2]]&&x>1)
       { aux=H[x]; H[x]=H[x/2]; H[x/2]=aux;
	 aux=poz[H[x]]; poz[H[x]]=poz[H[x/2]]; poz[H[x/2]]=aux;
       }
     x/=2;
   }
}
void sift(long x)
{ ok=1;
  while(2*x<=n&&ok)
   { if(2*x<=n) a=val[H[2*x]]; else a=1000000002;
     if(2*x<=n+1) b=val[H[2*x+1]]; else b=1000000002;
     minim=min(a,b); ok=0;
     if(minim<=1000000000&&minim==a)
      { aux=H[x]; H[x]=H[x*2]; H[x*2]=aux;
	aux=poz[H[x]]; poz[x]=poz[H[x*2]]; poz[H[x*2]]=aux; ok=1; x=2*x;
      }
     else if(minim<=1000000000&&minim==b)
      { aux=H[x]; H[x]=H[x*2+1]; H[x*2]=aux;
	aux=poz[H[x]]; poz[x]=poz[H[x*2+1]]; poz[H[x*2+1]]=aux; ok=1; x=2*x+1;
      }
   }
}
void add_heap()
{ n++; H[n]=nr; poz[nr]=n; percolate(n); }
void delete_heap()
{ H[poz[x]]=H[n]; poz[H[n]]=poz[x]; n--;
  if(val[H[poz[H[x]]]]<val[H[poz[H[x]]/2]]) percolate(poz[H[x]]); else sift(poz[x]);
}
void querry()
{ fprintf(g,"%ld\n",val[H[1]]); }
int main()
{ f=fopen("heapuri.in","r"); g=fopen("heapuri.out","w");
  fscanf(f,"%ld",&op);
  for(o=1;o<=op;o++)
   { fscanf(f,"%ld",&semn);
     if(semn==1) { fscanf(f,"%ld",&x); nr++; val[nr]=x; add_heap(); }
     else if(semn==2) { fscanf(f,"%ld",&x); delete_heap(); }
     else querry();
   }
  fclose(g);
  return 0;
}