Cod sursa(job #2291019)

Utilizator stefan_creastaStefan Creasta stefan_creasta Data 27 noiembrie 2018 12:44:03
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <cstdio>
using namespace std;
const int NMAX = 200005;
const int INF = 0x7fffffff;
struct Pozitii {
  int val, poz;
};
Pozitii v[NMAX];
int poznr[NMAX];
void schimb(int i, int j) {
  int aux2 = poznr[v[i].poz];
  poznr[v[i].poz] = poznr[v[j].poz];
  poznr[v[j].poz] = aux2;
  int aux = v[i].val;
  v[i].val = v[j].val;
  v[j].val = aux;
  aux = v[i].poz;
  v[i].poz = v[j].poz;
  v[j].poz = aux;
}
void update_jos(int nod) {
  int poz = nod / 2;
  if(poz > 0 && v[poz].val > v[nod].val) {
    schimb(nod, poz);
    update_jos(poz);
  }
}
void update_sus(int nod) {
  int poz = -1;
  if(v[nod].val > v[2 * nod].val && v[nod].val > v[2 * nod + 1].val) {
    poz = 2 * nod + 1;
    if(v[2 * nod].val < v[2 * nod + 1].val) {
      poz--;
    }
  }
  else if(v[nod].val > v[2 * nod].val){
    poz = 2 * nod;
  }
  else if(v[nod].val > v[2 * nod + 1].val) {
    poz = 2 * nod + 1;
  }
  if(poz != -1) {
    schimb(nod, poz);
    update_sus(poz);
  }
}

int main() {
  int n, total = 0, top = 0;
  freopen("heapuri.in", "r", stdin);
  freopen("heapuri.out", "w", stdout);
  scanf("%d", &n);
  for(int i = 1; i <= n; i++) {
    v[i].val = INF;
  }
  for(int i = 1; i <= n; i++) {
    int op;
    scanf("%d", &op);
    if(op == 1) {
      scanf("%d", &v[++top].val);
      poznr[++total] = top;
      v[top].poz = total;
      update_jos(top);
    }
    else if(op == 2) {
      int nr;
      scanf("%d", &nr);
      int pozitie = poznr[nr];
      schimb(top, poznr[nr]);
      v[top--].val = INF;
      update_sus(pozitie);
    }
    else {
      printf("%d\n", v[1].val);
    }
    /*printf("\n");
    for(int i = 1; i <= top; i++) {
      printf("%d ", v[i].val);
    }
    printf("\n");*/
  }
  return 0;
}