Cod sursa(job #3231520)

Utilizator AleX102004Alexandru Staiculescu AleX102004 Data 26 mai 2024 22:11:16
Problema Heapuri Scor 10
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void inserare(int heap[],int x,int i,int crono[], int poz[], int nr_citite){
	int aux,ok=1;
	heap[i]=x;
	crono[nr_citite]=i;
	poz[i]=nr_citite;
	do{
		if(heap[i]<heap[i/2]){
			aux=heap[i/2];
			heap[i/2]=heap[i];
			heap[i]=aux; 
			
			crono[nr_citite]=i/2;
			crono[poz[i/2]]=i;
			
			aux=poz[i/2];
			poz[i/2]=crono[nr_citite];
			poz[i]=aux;
			
			ok=0;
			i=i/2;
		}
		else
			ok=1;
	}while(i!=1 && ok==0);
}

int stergere(int heap[], int x,int crono[]){
	int j=crono[x];
	while((2*j+1)<200000 && heap[2*j]!=-1 && heap[2*j+1]!=-1){
		if(heap[2*j] < heap[2*j+1]){
			heap[j]=heap[2*j];
			j=2*j;
			}
		else{
			heap[j]=heap[2*j+1];
			j=2*j+1;
			}
	}
	if((2*j)<200000 && heap[2*j]!=-1){
		heap[j]=heap[2*j];
		j=2*j;
	}
	return j;
}


int main(){
	int heap[200000],i=1,n,k,x,nr_citite=1;
	int crono[200000];//indexul e ordinea cronologica
	int poz[200000]; //indexul este pozitia
	FILE *f, *g;
	if((f=fopen("heapuri.in","r"))==NULL){
		printf("eroare deschidere fisier\n");
		exit(1);
	}
	if((g=fopen("heapuri.out","w"))==NULL){
		printf("eroare deschidere fisier\n");
		exit(1);
	}
	fscanf(f,"%d",&n);
	memset(heap,-1,n*sizeof(int));
	for(int j=0;j<n;j++){
		fscanf(f,"%d",&k);
		switch(k){
			case 1:
				fscanf(f,"%d",&x);
				inserare(heap,x,i,crono,poz,nr_citite);
				i++;
				nr_citite++;
				break;
			case 2:
				fscanf(f,"%d",&x);
				i=stergere(heap,x,crono);
				break;
			case 3:
				fprintf(g,"%d\n",heap[1]);
				break;
		}
	}
	fclose(f);
	fclose(g);
	return 0;
}