Cod sursa(job #631937)

Utilizator sunt_emoSunt emo sunt_emo Data 9 noiembrie 2011 22:26:12
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <fstream>
#include <iostream>
#define N 200010
using namespace std;

std::ifstream in ("heapuri.in");
std::ofstream out ("heapuri.out");
int h[2*N],a[N],b[N],n,m,i,k,nh,z;

void swap (int x,int y) {
	b[h[y]]=x; b[h[x]]=y;
	z=h[x]; h[x]=h[y]; h[y]=z;
}

void up (int k) {
	if (k>1)
		if (a[h[k/2]]>a[h[k]]) {
			swap (k,k/2);
			up (k/2);
		}
}

void down (int k) {
	if (2*k>nh) return;
	i=k;
	if (a[h[k]]>a[h[2*k]]) i=2*k;
	if (2*k+1<=nh) if (a[h[i]]>a[h[2*k+1]]) i=2*k+1;
	if (i!=k) {
		swap (k,i);
		down (i);
	}
}

int main () {
	in>>m;
	while (m--) {
		in>>i;
		if (i==1) {
			in>>a[++n];
			b[n]=++nh;
			h[nh]=n;
			up (nh);
		}
		else if (i==2) {
			in>>k;
			swap (b[k],nh);
			nh--;
			up (b[nh+1]);
			down (b[nh+1]);
		}
		else out<<a[h[1]]<<"\n";
	}
	return 0;
}