Cod sursa(job #315164)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 14 mai 2009 16:40:24
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<algorithm>
using namespace std;

#define DIM 200001

struct hp{
    int val,poz;};

int n,m,cnt,h[DIM];
hp a[DIM];

void swap(int x,int y){
    int aux;

    aux=h[x];
    h[x]=h[y];
    h[y]=aux;}

void uph(int k){
	int aux;

	while(k>1){
	    aux=k>>1;
	    if(a[h[k]].val<a[h[aux]].val){
	        a[h[k]].poz=aux;
	        a[h[aux]].poz=k;
			swap(k,aux);
			k=aux;}
        else
            return;}}

void downh(int k){
    int aux;

	while(k<=n){
		aux=k;
		if(k<<1<=n){
			aux=k<<1;
			if(aux+1<=n&&a[h[aux+1]].val<a[h[aux]].val)
				++aux;}
    else
        return;
    if(a[h[aux]].val<a[h[k]].val){
        a[h[aux]].poz=k;
        a[h[k]].poz=aux;
		swap(k,aux);
		k=aux;}
	else
		return;}}

void insert(int val){

    h[++n]=cnt;
    a[h[n]].poz=n;
    a[h[n]].val=val;
    uph(n);}

void cut(int k){

    h[k]=h[n--];
    a[h[k]].poz=k;
    if(k>1&&a[h[k]].val<a[h[k>>1]].val)
        uph(k);
    else
        downh(k);}

void solve(){
	int i,poz,tip,val;

    scanf("%d",&m);
	for(i=0; i<m; ++i){
        scanf("%d",&tip);
        if(tip==1){
            scanf("%d",&val);
            ++cnt;
            insert(val);}
        else if(tip==2){
			scanf("%d",&poz);
			cut(a[poz].poz);}
        else
            printf("%d\n",a[h[1]].val);}}

int main(){

    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);

    solve();
    return 0;}