Cod sursa(job #2922582)

Utilizator Remus.RughinisRemus Rughinis Remus.Rughinis Data 8 septembrie 2022 23:01:31
Problema Heapuri Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <stdio.h>
#define MAXN 200000
#define PARENT(X) X / 2
#define CHILD(X) X * 2

int v[MAXN], vn, ad[MAXN], nr = 0;

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;
}

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

void downHeap(int x) {
  int c1 = v[CHILD(x)];
  int c2 = v[CHILD(x) + 1];

  if (c1 != 0) {
    if (c1 < v[x] && (c1 < c2 || c2 == 0)) {
      swap(x, c1);
      downHeap(c1);

    } else if (c2 != 0 && c2 < v[x] && c2 < c1) {
      swap(x, c2);
      downHeap(c2);
    }
  }
}

void addElement(int x) {
  v[vn] = x;
  ad[nr] = vn + 1;
  nr++;
  climbHeap(x);
  vn++;
}

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

  downHeap(x);
}

int main() {
  int n, i, j, t, x;
  FILE *fin, *fout;

  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);
      j = 0;
      while (ad[j] != x)
        j++;
      deleteElement(j);

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

  return 0;
}