Cod sursa(job #303600)

Utilizator adrianraduleaRadulea Adrian adrianradulea Data 10 aprilie 2009 00:39:00
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include<stdio.h>
FILE *f,*g;
long coresp[200000],H[200000],z,ok,ls,nr,rs,i,poz[200000],st[200000],aux,n,nod[200000],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;
	z=nod[coresp[pozt]]; nod[coresp[pozt]]=nod[coresp[pozt/2]]; nod[coresp[pozt/2]]=z;
	z=coresp[pozt]; coresp[pozt]=coresp[pozt/2]; coresp[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;
	 z=nod[coresp[pozt]]; nod[coresp[pozt]]=nod[coresp[pozt*2]]; nod[coresp[pozt*2]]=z;
	 z=coresp[pozt]; coresp[pozt]=coresp[pozt*2]; coresp[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;
	 z=nod[coresp[pozt]]; nod[coresp[pozt]]=nod[coresp[pozt*2+1]]; nod[coresp[pozt*2+1]]=z;
	 z=coresp[pozt]; coresp[pozt]=coresp[pozt*2+1]; coresp[pozt*2+1]=z;
	 pozt=pozt*2+1;
       }
       ok=0;
     }
    if(!ok) ok++; else ok=0;
  }
}
void insert_heap(long x)
{ nr++; st[nr]=x; n++; nod[nr]=n; coresp[n]=nr; H[n]=x; percolate(n); }
void delete_heap(long x)
{ H[nod[x]]=H[n]; n--; nod[coresp[n+1]]=nod[x];
  if(H[nod[st[x]]]<H[nod[st[x]]/2]) percolate(nod[st[x]]);
  else sift(nod[st[x]]);
}
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 { aux=H[1]; fprintf(g,"%ld\n",aux); }
   }
  fclose(g);
  return 0;
}