Cod sursa(job #2809115)

Utilizator teochess2017Togan Teodor-Bogdan teochess2017 Data 26 noiembrie 2021 00:10:04
Problema Heapuri Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.04 kb
#include <stdio.h>
#include <stdlib.h>

#define MAXN 262144
#define INF 1000000001

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

void adauga(int i, int el, int n){
  int aux, nod;
  nod = 1;
  while(arb[nod] != INF){
    nod *= 2;
    if(arb[nod] != INF){
      if(nrn[nod + 1] < nrn[nod]){
        nod++;
      }
    }
  }
  arb[nod] = el;
  poz[i] = nod;
  revpoz[nod] = i;
  nrn[nod] = 1;
  while((1 < nod) && (arb[nod] < arb[nod / 2])){
    aux = arb[nod];
    arb[nod] = arb[nod / 2];
    arb[nod / 2] = aux;
    poz[revpoz[nod]] = nod / 2;
    poz[revpoz[nod / 2]] = nod;
    aux = revpoz[nod];
    revpoz[nod] = revpoz[nod / 2];
    revpoz[nod / 2] = aux;
    nrn[nod / 2]++;
    nod /= 2;
  }
  while(1 < nod){
    nrn[nod / 2]++;
    nod /= 2;
  }
}
void minusnrn(int nod){
  while(1 <= nod){
    nrn[nod]--;
    nod /= 2;
  }
}
void sterge(int i, int n){
  int nod, el;
  nod = poz[i];
  nod *= 2;
  if(arb[nod + 1] < arb[nod]){
    nod++;
  }
  while(arb[nod] != INF){
    nrn[nod / 2]--;
    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;
  nrn[nod / 2]--;
}

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);
        minusnrn(poz[val - 1] / 2);
        nrel--;
      }else{
        fprintf(fout, "%d\n", arb[1]);
      }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}