Cod sursa(job #2922783)

Utilizator Remus.RughinisRemus Rughinis Remus.Rughinis Data 10 septembrie 2022 00:15:59
Problema Heapuri Scor 40
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <stdio.h>
#define MAXN 200000

int v[MAXN], vn, ad[MAXN], nr = 1, cronToHeap[MAXN];

static inline int PARENT(int x) {
  if (x == 0)
    return 0;
  else
    return (x - 1) / 2;
}
static inline int CHILD(int x) { return x * 2 + 1; }

static inline void swap(int x, int y) {
  int aux = v[x];
  v[x] = v[y];
  v[y] = aux;

  aux = ad[x];
  ad[x] = ad[y];
  ad[y] = aux;

  aux = cronToHeap[ad[x]];
  cronToHeap[ad[x]] = cronToHeap[ad[y]];
  cronToHeap[ad[y]] = aux;
}

FILE *fdb;
void printx(int x) {
  fprintf(fdb, "%d ", v[x]);

  if (CHILD(x) < vn)
    printx(CHILD(x));

  if (CHILD(x) + 1 < vn)
    printx(CHILD(x) + 1);
}
void printHeap() {
  fprintf(fdb, "Heap: ");
  printx(0);
  fprintf(fdb, "\n");
}

void climbHeap(int x) {
  while (v[x] < v[PARENT(x)]) {
    swap(x, PARENT(x));
    x = PARENT(x);
  }
}

void downHeap(int x) {
  int c1 = CHILD(x);
  int c2 = CHILD(x) + 1;
  int min = -1;

  if (c2 < vn) {
    if (v[c1] < v[c2])
      min = c1;
    else
      min = c2;

  } else if (c1 < vn) {
    min = c1;
  }

  if (min != -1 && v[min] < v[x]) {
    swap(x, min);
    downHeap(min);
  }
}

void addElement(int x) {
  v[vn] = x;
  ad[vn] = nr;
  cronToHeap[nr] = vn;

  vn++;
  nr++;
  climbHeap(vn - 1);
}

void deleteElement(int x) {
  swap(x, vn - 1);
  vn--;

  downHeap(x);
}

int main() {
  int n, i, j, t, x;
  FILE *fin, *fout;
  // fdb = fopen("heap.out", "w");

  fin = fopen("heapuri.in", "r");
  fout = fopen("heapuri.out", "w");
  fscanf(fin, "%d", &n);
  for (i = 0; i < n; i++) {
    fscanf(fin, "%d", &t);

    if (t == 1) { // Adaugam x
      fscanf(fin, "%d", &x);
      addElement(x);

    } else if (t == 2) {
      fscanf(fin, "%d", &x);
      deleteElement(cronToHeap[x]);

    } else {
      fprintf(fout, "%d\n", v[0]);
    }

    // printHeap();
    // fprintf(fdb, "Ad: ");
    // for (j = 0; j < vn; j++)
    //   fprintf(fdb, "%d ", ad[j]);
    // fprintf(fdb, "\n");
  }
  fclose(fin);
  fclose(fout);

  // fclose(fdb);
  return 0;
}