Cod sursa(job #825362)

Utilizator vladm97Matei Vlad vladm97 Data 28 noiembrie 2012 21:30:20
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream>
using namespace std;
int heap[200000],poz[200000];
int tata(int n){
	return n/2;}
int fiust(int n){
	return 2*n;}
int fiudr(int n){
	return 2*n+1;}
int minim(){
	return heap[1];}
void cerne(int n, int k){
	int fiu;
	do{
		fiu=0;
		if(fiust(k)<=n){
			fiu=fiust(k);
			if((fiudr(k)<=n)&&(heap[fiudr(k)]<heap[fiust(k)]))fiu=fiudr(k);
			if(heap[fiu]>=heap[k])
				fiu=0;}
			 if (fiu) {
            swap(heap[k], heap[fiu]);  
            k=fiu;}
			
    } while (fiu);
}
void interclaseaza(int n,int k){
	int aux;
	aux=heap[k];
	while((k>1)&&(aux<heap[tata(k)]))
	{	heap[k]=heap[tata(k)];
        k=tata(k);
    }
    heap[k]=aux;
}

void eliminare(int &n, int k){
	heap[k]=heap[n];
	n--;
	if((k>1)&&(heap[k]<heap[tata(k)]))
		interclaseaza(n, k);
		else cerne(n,k);
}

void introducere(int &n, int element){
	heap[++n]=element;
	interclaseaza(n,n);
}
int cautare(int n, int p){
	int i,x=poz[p];
	for(i=1;i<=n;i++)
		if(heap[i]==x) return i;}
int main(){
	int i,x,y,nrop,n=0,k=0;
	ifstream f("heapuri.in");
	ofstream g("heapuri.out");
	f>>nrop;
	for(i=1;i<=nrop;i++){
		f>>x;
		if(x==1){
			f>>y;
			poz[++k]=y;
			introducere(n,y);}
		else if(x==2){
			f>>y;
			eliminare(n,cautare(n,y));}
		else g<<minim()<<'\n';
	}
	f.close();
	g.close();
}