Cod sursa(job #398170)

Utilizator johsonsbabiJohnsons Babi Minune johsonsbabi Data 18 februarie 2010 03:31:00
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <stdio.h>
#include <algorithm>
using namespace std;
#define M 200010
FILE*f=fopen("heapuri.in","r");
FILE*g=fopen("heapuri.out","w");
struct {
	int val,ordine;
} h[M];

int n,nrop,ord[M];

void sift(int n,int k){
	int fiu,c;
	do{
		c=k<<1;
		fiu=0;
		if(c<=n){
			fiu=c;
			if(c+1<=n && h[fiu].val>=h[c+1].val){
				fiu=c+1;
			}
			if(h[fiu].val>=h[k].val){
				fiu=0;
			}
		}
		if(fiu){
			swap(h[fiu].val,h[k].val);
			swap(h[fiu].ordine,h[k].ordine);
			// aici ordine
			swap(ord[h[fiu].ordine],ord[h[k].ordine]);
			k=fiu;
		}
		
	}while(fiu);
	
}

void percolate(int n,int k){
	while(k>1 && h[k/2].val>h[k].val){
		swap(h[k/2].val,h[k].val);
		swap(h[k/2].ordine,h[k].ordine);
			// aici ordine
		swap(ord[h[k/2].ordine],ord[h[k].ordine]);
		k/=2;
	}
}

int main(){
	
	int x,tip,i,ordin=0,aux,aux2;
	
	fscanf(f,"%d",&nrop);
	for(i=1;i<=nrop;i++){
		fscanf(f,"%d",&tip);
		if(tip==1){
			fscanf(f,"%d",&x);
			h[++n].val=x;
			ordin++;
			h[n].ordine=ordin;
			ord[n]=n;
			percolate(n,n);
		}
		else if(tip==2){
			fscanf(f,"%d",&x);
			//aux=ord[h[ord[x]].ordine];
			swap(h[ord[x]].val,h[n].val);
			//aux=ord[h[ord[n]].ordine];
			//aux2=ord[h[ord[x]].ordine];
			swap(h[ord[x]].ordine,h[n].ordine);
			//swap(ord[h[n].ordine],ord[ord[x]]);
			swap(ord[h[n].ordine],ord[h[ord[x]].ordine]);
			//swap(ord[aux],ord[aux2]);
			h[n].val=0;
			//ord[n]=0;
			n--;
			sift(n,1);
		}
		else {
			fprintf(g,"%d\n",h[1]);
		}
		
		
	}
	
	fclose(f);
	fclose(g);
	return 0;
}