Cod sursa(job #251378)

Utilizator FlorianFlorian Marcu Florian Data 2 februarie 2009 14:17:24
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<stdio.h>
#define MAX 200003
FILE*f=fopen("heap.in","r");
FILE*g=fopen("heap.out","w");
int H[MAX], A[MAX], Poz[MAX];
int N, NR;
// Pos[i] - pozitia nodului i, in H[]

void insert(int x)  //Inserez x in heap
 {
 int aux;
 N++;
 Poz[++NR]=x; // x intra al NR-lea in multime
 H[N]=x;
 int T=N/2;
 int K=N;
 while(K>1 && ( H[K] < H[T]))
   {
    aux=H[K]; H[K]=H[T]; H[T]=aux;
    K=K/2;
    T=K/2;
   }
 }
void del(int x) // Sterg elementul intrat al x-lea in multime<=>Sterg Poz[x]
 {
 
  int i,K,aux;
  for(i=1;i<=N;++i)  if(H[i] == Poz[x]) {K=i; break;}  //caut pozitia lui poz[x] in H

  // elementul care trebuie sters se gaseste in nodul K in heap
  H[K] = H[N];
  --N;
  Poz[x] = -1;
  int fiu;
  do
   {
    fiu=0;
    if(2*K <= N && H[K] > H[2*K]) fiu=2*K;
    if(2*K+1<=N && H[2*K]>H[2*K+1]) fiu=2*K+1;
    if(H[fiu] >= H[K]) fiu=0;
    if(fiu)
      {
        aux = H[fiu];
        H[fiu]= H[K];
        H[K] = aux;
        K=fiu;
      }
   }
  while(fiu);
 }
int main()
 {
  int n;
  fscanf(f,"%d",&n);
  int cod,x;
  while(n--)
   {
    fscanf(f,"%d",&cod);
    if(cod<3)
     {
      fscanf(f,"%d",&x);
      if(cod==1)
       {
        insert(x);
       }
      else del(x);
     }
    else
     fprintf(g,"%d\n",H[1]);
   }
 return 0;
 }