Cod sursa(job #336845)

Utilizator szabotamasSzabo Tamas szabotamas Data 1 august 2009 18:15:48
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <algorithm>

#define NMAX 200001

using namespace std;

long v[NMAX],t[NMAX],poz[NMAX],a,b,n,nn,m,q,w;

void down(long n,long k){
	int ok=0;
	while (ok==0){
		ok=1;
		if (k*2<=n){
			long x=k*2;
			if (k*2+1<=n && t[v[k*2+1]]<t[v[k*2]]){
				x=k*2+1;
			}
			if (t[v[x]]<t[v[k]]){
				ok=0;
				swap(v[x],v[k]);
				swap(poz[v[x]],poz[v[k]]);
				k=x;
			}
		}
	}
}

void up(long n,long k){
	int ok=0;
	while (ok==0){
		ok=1;
		if (k>1){
			if (t[v[k]]<t[v[k/2]]){
				ok=0;
				swap(v[k],v[k/2]);
				swap(poz[v[k]],poz[v[k/2]]);
				k=k/2;
			}
		}
	}
}

void insert(long &n,long a){
	t[++nn]=a;
	v[++n]=nn;
	poz[nn]=n;
	up(n,n);
}

void remove(long &n,long a){
	long k=poz[a];
	swap(v[k],v[n]);
	swap(poz[v[k]],poz[v[n]]);
	n--;
	if (k>1){
		if (v[k/2]>v[k]){
			up(n,k);
		}
		else down(n,k);
	}
	else down(n,k);
}

long min(){
	return t[v[1]];
}


int main(){
	freopen("heapuri.in", "r", stdin);
	freopen("heapuri.out", "w", stdout);
	scanf("%ld ", &m);
	for (w=1; w<=m; w++){
		scanf ("%ld ", &q);
		switch(q){
			case 1:{
				scanf("%ld ", &a);
				insert(n,a);
				break;
				   }
			case 2:{
				scanf("%ld ", &a);
				remove(n,a);
				break;
				   }
			case 3:{
				printf("%ld\n", min());
				break;
				   }
		}
	}
	return 0;
}