Cod sursa(job #1401408)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 25 martie 2015 20:43:14
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <stdio.h>

#define MAX_N 200000

int v[MAX_N];
int nElem;
int h[MAX_N];
int hpos[MAX_N];
int hSize;

void sift(int *size, int k) {
  int best, changed;

  do {
    changed = 0;
    best = k;
    if ((2 * k + 1 < *size) && (v[h[2 * k + 1]] < v[h[best]])) {
      best = 2 * k + 1;
    }
    if ((2 * k + 2 < *size) && (v[h[2 * k + 2] < v[h[best]]])) {
      best = 2 * k + 2;
    }
    if (best != k) {
      hpos[h[k]] = best;
      hpos[h[best]] = k;
      int tmp = h[k];
      h[k] = h[best];
      h[best] = tmp;
      k = best;
      changed = 1;
    }
  } while (changed);
}
void percolate(int k) {
  int a = h[k];
  int p = (k - 1) / 2;
  while (k && (v[a] < v[h[p]])) {
    hpos[h[k]] = p;
    hpos[h[p]] = k;
    int tmp = h[k];
    h[k] = h[p];
    h[p] = tmp;
    k = p;
    p = (k - 1) / 2;
  }
}
void heapInsert(int *size, int k) {
  h[*size] = k;
  hpos[k] = *size;
  ++(*size);
  percolate(k);
}
void heapExtract(int *size, int k) {
  --(*size);
  hpos[h[*size]] = k;
  h[k] = h[*size];
  if (k && (v[h[k]] < v[h[(k - 1) / 2]])) {
    percolate(k);
  } else {
    sift(size, k);
  }
}
int main (void) {
  FILE *f, *g;
  char c;
  int query, x;

  f = fopen("heapuri.in", "r");
  fscanf(f, "%d ", &query);
  g = fopen("heapuri.out", "w");
  for (; query; --query) {
    fscanf(f, " %c", &c);
    switch (c) {
    case '1':
      fscanf(f, "%d", &x);
      v[nElem++] = x;
      heapInsert(&hSize, nElem - 1);
      break;
     case '2':
      fscanf(f, "%d", &x);
      heapExtract(&hSize, hpos[x - 1]);
      break;
     case '3':
       fprintf(g, "%d\n", v[h[0]]);
       break;
    }
  }
  fclose(f);
  fclose(g);
  return 0;
}