Cod sursa(job #625164)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 23 octombrie 2011 21:20:17
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>

using namespace std;

ifstream in("heapuri.in");
ofstream out("heapuri.out");

const int N=200001;
const int INF=2000000000;

int n,heapsize,ord[N];

struct punct{
	int val,cron;
}v[N];

inline void schimba(int x,int y){
	punct aux;
	aux=v[y];
	v[y]=v[x];
	v[x]=aux;
}

int urca(int x){
	while(v[x].val<v[x/2].val && (x/2)>=1){
		schimba(x,x/2);
		ord[x/2]=x;
		x=x/2;
	}
	return x;
}

void coboara(int x){
	int min;
	if(2*x>heapsize)
		return;
	if(2*x==heapsize){
		min=2*x;
	}
	else{
		min=2*x;
		if(v[2*x+1].val<v[min].val)
			min=2*x+1;
	}
	schimba(x,min);
	ord[v[min].cron]=x;
	ord[v[x].cron]=min;
	x=min;
	coboara(x);
}

int main(){
	int i,opcode,opvalue;
	in>>n;
	for(i=1;i<=n;i++){
		in>>opcode;
		if(opcode==1){
			in>>opvalue;
			heapsize++;
			v[heapsize].val=opvalue;
			v[heapsize].cron=heapsize;
			ord[heapsize]=urca(heapsize);
		}
		if(opcode==2){
			in>>opvalue;
			v[ord[opvalue]].val=INF;
			coboara(ord[opvalue]);
		}
		if(opcode==3){
			out<<v[1].val<<"\n";
		}
	}			
	return 0;
}