Cod sursa(job #823249)

Utilizator deea101Andreea deea101 Data 24 noiembrie 2012 20:10:55
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
vector <int> heap;
int a[200001],b[200001],n=0,nh;
int percolate(int k)
{
	if(b[heap[k]]<b[heap[k/2]] && k>1)
	{
		swap(heap[k],heap[k/2]);
		a[heap[k]]=k;
		k=k/2; 
		return percolate(k);
	}
	else return k;
}
int sift(int k, int nr)
{
	int son; son=2*k;
	if(son<=nr && b[heap[son]]<b[heap[k]])
	{
		if(son+1<=nr && b[heap[son+1]]<b[heap[son]])
			son=son+1;
		swap(heap[son],heap[k]);
		a[heap[k]]=k;
		k=son;
		return sift(k, nr);
	}
	else return k;
}
int insert(int x)
{
	heap.push_back(x);
	if(nh>1) 
		return percolate(nh);
	else return 1;
}
void stergere(int x)
{
	int k=a[x];
	heap[k]=heap[nh]; a[heap[nh]]=k;
	if(k>1 && b[heap[k]]<b[heap[k/2]]) 
		a[heap[k]]=percolate(k);
	else 
		a[heap[k]]=sift(k,nh-1);
	heap.pop_back();
}
	
int main()
{
	int nr,c,x;
	f>>nr;
	int i;
	heap.push_back(0); 
	for(i=0;i<nr;i++)
	{
		f>>c;
		if(c==1) { 
			f>>x; n++; nh++; b[n]=x; 
			a[n]=insert(n);}
		if(c==2) { f>>x; 
			stergere(x); nh--;}
		if(c==3) g<<b[heap[1]]<<endl;
	}
}