Cod sursa(job #410406)

Utilizator S7012MYPetru Trimbitas S7012MY Data 4 martie 2010 12:52:57
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <stdio.h>
#define maxint 10001;
using namespace std;

int a[100000];
int N=0;

FILE *f, *g;

void upheap(int k) {
	int val=a[k]; 
	a[0]=0;
	while (a[k/2]>=val) {
		a[k]=a[k/2];
		k/=2;
	}
	a[k]=val;
}


void downheap(int k) {
	int j, val=a[k];
	while(k<=N/2) {
		j=k+k;
		if(j<N) 
			if(a[j]>a[j+1])
				j++;
		if(val<=a[j]) break;
		a[k]=a[j];
		k=j;
	}
	a[k]=val;
}

void insert (int val) {
	N++;
	a[N]=val;
	upheap(N);
}

int remove() {
	int val=a[1];
	a[1]=a[N];
	N--;
	downheap(1);
	return val;
}

void del (int k) {
	int i;
	for(i=0; i<N; i++) {
		if (a[i]==k) {
			a[i]=a[N];
			N--;
			break;
		}
	}
	downheap(i);
}

int main()
{
	int y,i,j,k,cont=1,vect[100000];
	f=fopen("heapuri.in", "rt");
	g=fopen("heapuri.out", "wt");
	fscanf(f, "%d", &y);
	for(i=0; i<y; i++) {
		fscanf(f, "%d", &j);
		if(j==1) {
			fscanf(f, "%d", &k);
			insert (k);
			vect[cont]=k;
			cont++;
		}
		else if(j==2) {
			fscanf(f, "%d", &k);
			del(vect[k]);
		}
		else {
			fprintf(g, "%d", a[1]);
			fprintf(g, "\n");
		}
	}
	fclose(f);
	fclose(g);
	return 0;
}