Cod sursa(job #2747041)

Utilizator Teodora67IDKIDKIDKDIKD Teodora67 Data 28 aprilie 2021 19:43:24
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
/*Acesta este heapul scris de mana
Heapul este deja implementt in c++
sub numele de priority queue
*/
#include <fstream>
#include <iostream>
using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

const int N = 200000 + 7;
int n;
int ind[N];
int pos[N];
int t[N];
void schimba(int a, int b);
void repara(int a);
 void coboara(int a) ;
 void urca(int a);
int main() {

  int q, id = 0;
  fin >> q;
  while (q--) {
    int type;
    fin >> type;
    if (type == 1) {
      int x;
    fin >> x;
      n++;
      id++;
      t[n] = x;
      ind[n] = id;
      pos[id] = n;

      urca(n);
    }
    if (type == 2) {
      int x;
      fin >> x;
      int b = pos[x];
      schimba(n, b);
      n--;
      repara(b);
    }
    if (type == 3) {
      fout << t[1]<<"\n";
    }
  }

}
void schimba(int a, int b) {
  swap(t[a], t[b]);
  swap(ind[a], ind[b]);
  pos[ind[a]] = a;
  pos[ind[b]] = b;
}

void urca(int a) {
  if (a == 1) {
    return;
  }
  if (t[a / 2] > t[a]) {
    schimba(a, a / 2);
    urca(a / 2);
  }
}

void coboara(int a) {
  int b = 0;
  if (2 * a <= n) {
    b = 2 * a;
    if (2 * a + 1 <= n && t[2 * a + 1] < t[2 * a]) {
      b = 2 * a + 1;
    }
  }
  if (b > 0 && t[b] < t[a]) {
    schimba(a, b);
    coboara(b);
  }
}

void repara(int a) {
  if (a > 1 && t[a / 2] > t[a]) {
    urca(a);
  } else {
    coboara(a);
  }
}