Cod sursa(job #581419)

Utilizator andrei.finaruFinaru Andrei Emanuel andrei.finaru Data 14 aprilie 2011 10:06:08
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<fstream.h>
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n,v[200005],heap[200005],t,x,o,c,cand[200005];
void schimba(int a, int b)
{ int c=heap[a]; 
  heap[a]=heap[b]; 
  heap[b]=c;
  c=v[cand[a]];
  v[cand[a]]=v[cand[b]];
  v[cand[b]]=c;
  c=cand[a];
  cand[a]=cand[b];
  cand[b]=c;
}
void sift(int);
void percolate(int);
void insert(int);
void elim(int);
int main()
{
	for(f>>o;o;--o)
		{ f>>t;
		  if(t==3) g<<heap[1]<<'\n';
			  else if(t==1)
				      { f>>x;
						insert(x);
					  }
					  else { f>>x;
						     elim(v[x]);
						   }
		  //for(int i=1;i<=n;++i) g<<heap[i]<<' '<<v[i]<<' '<<cand[i]<<'\n';
		  //g<<'\n';
		}
	f.close(); g.close();
	return 0;
}

void sift(int k)
{
	int son;
	do{ son=0;
		if(k+k<=n) 
			{ son=k+k;
			  if(son<n && heap[son+1]<heap[son]) ++son;
			  if(heap[son]>=heap[k]) son=0;
			}
		if(son) { schimba(k,son); k=son;}
	  } while(son);
}

void percolate(int k)
{
	int key=heap[k];
	while(k>1 && key<heap[k/2]) 
		{ schimba(k,k/2);
		  k/=2;
		}
}

void insert(int x)
{
	heap[++n]=x;
	v[++c]=n;
	cand[n]=c;
	percolate(n);
}

void elim(int k)
{ schimba(k,n);
  --n;
  if(heap[k]<heap[k/2]) percolate(k);
  else sift(k);
}