Cod sursa(job #2808934)

Utilizator teochess2017Togan Teodor-Bogdan teochess2017 Data 25 noiembrie 2021 18:08:17
Problema Heapuri Scor 40
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <stdio.h>
#include <stdlib.h>

#define MAXN 262144
#define INF 1000000001

int arb[MAXN], poz[MAXN], revpoz[2 * MAXN], v[MAXN];

void adauga(int i, int el, int n){
  int aux;
  arb[n] = el;
  poz[i] = n;
  revpoz[n] = i;
  while((1 < n) && (arb[n] < arb[n / 2])){
    aux = arb[n];
    arb[n] = arb[n / 2];
    arb[n / 2] = aux;
    poz[revpoz[n]] = n / 2;
    poz[revpoz[n / 2]] = n;
    aux = revpoz[n];
    revpoz[n] = revpoz[n / 2];
    revpoz[n / 2] = aux;
    n /= 2;
  }
}
void sterge(int i, int n){
  int nod, el;
  nod = poz[i];
  nod = nod * 2;
  if(arb[nod + 1] < arb[nod]){
    nod++;
  }
  while(nod <= n){
    arb[nod / 2] = arb[nod];
    poz[revpoz[nod]] = nod / 2;
    revpoz[nod / 2] = revpoz[nod];
    nod = nod * 2;
    if(arb[nod + 1] < arb[nod]){
      nod++;
    }
  }
  arb[nod / 2] = INF;
}

int main()
{
    FILE *fin, *fout;
    int n, i, op, val, j, put, nrel;
    fin = fopen("heapuri.in", "r");
    fscanf(fin, "%d", &n);
    put = 1;
    while(put <= n){
      put *= 2;
    }
    for(i = 0; i <= put; i++){
      arb[i] = INF;
    }
    j = 0;
    nrel = 0;
    fout = fopen("heapuri.out", "w");
    for(i = 0; i < n; i++){
      fscanf(fin, "%d", &op);
      if(op == 1){
        fscanf(fin, "%d", &v[j]);
        nrel++;
        adauga(j, v[j], nrel);
        j++;
      }else if(op == 2){
        fscanf(fin, "%d", &val);
        sterge(val - 1, nrel);
        nrel--;
      }else{
        fprintf(fout, "%d\n", arb[1]);
      }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}