Cod sursa(job #951109)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 19 mai 2013 12:30:23
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#define INF 1000000000
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n;
int h[200011];

struct valori{
	int num;
	int poz;
};
valori v[200011];

int main(void){
	register int i,j,t,x,k=0,p,c,aux;
	
	f>>n;
	f>>t>>v[1].num;
	h[1]=1;
	k=1;
	h[0]=1;
	for(i=2;i<=n;i++){
		f>>t;
		if(t==1){
			f>>x;
			v[++k].num=x;
			v[k].poz=++h[0];
			h[h[0]]=k;
			c=h[0];
			p=h[0]/2;
			while(p>0 && v[h[p]].num>v[h[c]].num){
				aux=v[h[p]].poz;
				v[h[p]].poz=v[h[c]].poz;
				v[h[c]].poz=aux;
				aux=h[p];
				h[p]=h[c];
				h[c]=aux;
				c=p;
				p/=2;
			}
			continue;
		}
		if(t==2){
			f>>x;
			c=v[x].poz;
			v[x].num=-1;
			p=c/2;
			while(p>0 && v[h[p]].num>v[h[c]].num){
				aux=v[h[p]].poz;
				v[h[p]].poz=v[h[c]].poz;
				v[h[c]].poz=aux;
				aux=h[p];
				h[p]=h[c];
				h[c]=aux;
				c=p;
				p=c/2;
			}
			h[1]=h[h[0]];
			h[0]--;
			p=1,c=2;
			if(c+1<=h[0] && v[h[c+1]].num<v[h[c]].num)
				c++;
			while(v[h[p]].num>v[h[c]].num && c<=h[0]){
				aux=v[h[p]].poz;
				v[h[p]].poz=v[h[c]].poz;
				v[h[c]].poz=aux;
				aux=h[p];
				h[p]=h[c];
				h[c]=aux;
				p=c;
				c=2*p;
				if(c+1<=h[0] && v[h[c+1]].num<v[h[c]].num)
					c++;
			}
			continue;
		}
		g<<v[h[1]].num<<"\n";
	}
	return 0;
}