Cod sursa(job #303270)

Utilizator adrianraduleaRadulea Adrian adrianradulea Data 9 aprilie 2009 18:22:02
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<stdio.h>
FILE *f,*g;
long H[500000],z,ok,ls,nr,rs,i,poz[500000],st[500000],n,el,m,x,op;
void percolate(long pozt)
{ while(H[pozt]<H[pozt/2]&&pozt!=1)
   { if(H[pozt]<H[pozt/2]&&pozt!=1)
      { z=H[pozt]; H[pozt]=H[pozt/2]; H[pozt/2]=z;
	z=poz[H[pozt]]; poz[H[pozt]]=poz[H[pozt/2]]; poz[H[pozt/2]]=z;
	pozt/=2;
      }
   }
}
void sift(long pozt)
{ ok=1;
  while(ok)
  { ls=2*pozt; rs=2*pozt+1; if(ls>n) ls=0; if(rs>n) rs=0;
    if((H[ls]<H[pozt]&&ls)||(H[rs]<H[pozt]&&rs))
     { if((H[ls]<H[rs]&&ls)||(ls&&!rs))
       { z=H[pozt]; H[pozt]=H[pozt*2]; H[pozt*2]=H[pozt];
	 z=poz[H[pozt]]; poz[H[pozt]]=poz[H[pozt*2]]; poz[H[pozt*2]]=z;
	 pozt=pozt*2;
       }
       else if((H[rs]<H[pozt]&&rs)||(rs&&!ls))
       { z=H[pozt]; H[pozt]=H[pozt*2+1]; H[pozt*2+1]=H[pozt];
	 z=poz[H[pozt]]; poz[H[pozt]]=poz[H[pozt*2+1]]; poz[H[pozt*2+1]]=z;
	 pozt=pozt*2+1;
       }
       ok=0;
     }
    if(!ok) ok++; else ok=0;
  }
}
void insert_heap(long x)
{ n++; nr++; st[nr]=x; poz[x]=n; H[n]=x; percolate(n); }
void delete_heap(int x)
{ el=st[x];
  H[poz[el]]=H[n]; poz[H[n]]=poz[el]; n--;
  if(H[poz[el]]<H[poz[el]/2]) percolate(poz[el]);
  else sift(poz[el]);
}
int main()
{ f=fopen("heapuri.in","r"); g=fopen("heapuri.out","w");
  fscanf(f,"%ld",&m);
  for(i=1;i<=m;i++)
   { fscanf(f,"%ld",&op);
     if(op==1) { fscanf(f,"%ld",&x); insert_heap(x); }
     else if(op==2) { fscanf(f,"%ld",&x); delete_heap(x); }
     else fprintf(g,"%ld\n",H[1]);
   }
  fclose(g);
  return 0;
}