Cod sursa(job #427706)

Utilizator WildComunistChristian Ceausu WildComunist Data 28 martie 2010 12:52:26
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<fstream.h>
#include<math.h>
#define endl '\n'

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

struct nod{int p,x;};

nod v[200010];
int niv[200010],n;

int intmin(int i){
	if(2*i+1<=n) 
		if(v[2*i].x<v[2*i+1].x) 
			return 2*i;
		else return 2*i+1;
	else return 2*i;
}

void inversare(int i){
	int fiumin;
	nod aux;
	if(i<=n/2){
		fiumin=intmin(i);
		if(v[i].x>v[fiumin].x){
			niv[v[i].p]++;
			niv[v[fiumin].p]--;
			aux=v[i];
			v[i]=v[fiumin];
			v[fiumin]=aux;
			inversare(fiumin);
		}
	}
}	

void up(int t){
	int p;
	nod aux;
	if(t>1){
		p=t/2;
		if(v[p].x>v[t].x){
			niv[v[p].p]++;
			niv[v[t].p]--;
			aux=v[p];
			v[p]=v[t];
			v[t]=aux;
			up(p);
		}
	}
}	

void addnod(int k,int x){
	v[n].x=x;
	v[n].p=k;
	niv[k]=log2(n);
	up(n);
}

void sterge(int p){
	int i;
	int nivel=niv[p];
	for(i=(1<<nivel);i<(1<<(nivel+1))&&i<=n;i++){
		if(v[i].p==p) break;
	}
	v[i].x=1<<30;
	inversare(i);
}
	
int main(){
	int i,q,x,p,k=0,o;
	fin>>q;
	for(i=1;i<=q;i++){
		fin>>o;
		switch (o){
	    case 1:fin>>x;
			   n++;
			   k++;
			   addnod(k,x);
			   break;
	    case 2:fin>>p;
			   sterge(p);
			   break;
		case 3:fout<<v[1].x<<endl;
        }
	}
	return 0;
}