Cod sursa(job #429495)

Utilizator adrianraduleaRadulea Adrian adrianradulea Data 30 martie 2010 11:05:00
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<stdio.h>
FILE *f,*g;
long i,m,n,nr,a[200200],heap[200200],poz[200200],heapoz[200200],z,fiu,x;
int op;
void percolate(long k)
{ if(heap[k/2]>heap[k]) { z=heap[k/2]; heap[k/2]=heap[k]; heap[k]=z; z=heapoz[k/2]; heapoz[k/2]=heapoz[k]; heapoz[k]=z; poz[nr]=k/2; poz[heapoz[k]]=k; percolate(k/2); }}
void sift(long k)
{ fiu=0; 
  if(2*k<=n&&heap[2*k]<heap[k]) fiu=2*k;
  if(2*k+1<=n&&heap[2*k+1]<heap[k]&&heap[2*k+1]<heap[2*k]) fiu=2*k+1;
  if(fiu) { z=heap[k]; heap[k]=heap[fiu]; heap[fiu]=z; z=heapoz[k]; heapoz[k]=heapoz[fiu]; heapoz[fiu]=z; poz[heapoz[k]]=k; poz[heapoz[fiu]]=fiu; sift(fiu);  }
}
int main()
{ f=fopen("heapuri.in","r"); g=fopen("heapuri.out","w");
  fscanf(f,"%ld",&m);
  for(i=1;i<=m;i++)
   { fscanf(f,"%d",&op);
     if(op==1) 
        { fscanf(f,"%ld",&x); nr++; a[nr]=x; n++; heap[n]=x; poz[nr]=n; heapoz[n]=nr; percolate(n); } //functia percolate trebuie aplicata atat heapului de minim, cat si heapului de pozitie
	 else if(op==2)
	    { fscanf(f,"%ld",&x); heap[poz[x]]=heap[n]; n--; heapoz[poz[x]]=heapoz[n]; sift(poz[x]); }
	 else if(op==3) fprintf(g,"%ld\n",heap[1]);
   }
  fclose(g);
  return 0;
}