Cod sursa(job #823369)

Utilizator deea101Andreea deea101 Data 24 noiembrie 2012 22:09:01
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");

int a[200001],b[200001],heap[200001],n,nh;

int percolate(int k)
{
	while(b[heap[k]]<b[heap[k/2]] && k>1)
	{
		swap(heap[k],heap[k/2]);
		a[heap[k]]=k;
		k/=2; 
	}
	return k;
}
void sift(int k)
{
	int son; son=2*k;
	while(son<=nh && b[heap[son]]<b[heap[k]])
	{
		
		if(son+1<=nh && b[heap[son+1]]<b[heap[son]])
			son=son+1;
		a[heap[k]]=son;
		swap(heap[son],heap[k]);
		a[heap[k]]=k; 
		k=son;
		son=2*k;
	}
	
}
int main()
{
	int nr,c,x;
	f>>nr;
	int i;
	for(i=0;i<nr;i++)
	{
		f>>c;
		if(c==1) { 
			f>>x; n++; nh++; b[n]=x;
			heap[nh]=n;
			a[n]=percolate(nh);
			}
		if(c==2) { f>>x; b[x]=-1; 
			a[x]=percolate(a[x]);
			int k=1;
			heap[k]=heap[nh]; 
			a[heap[nh]]=k;
			nh--;
			sift(k);
			}
		if(c==3) g<<b[heap[1]]<<'\n';
	}
	//cout<<clock();
	return 0;
}