Cod sursa(job #2747264)

Utilizator andreea_07Andreea Georgescu andreea_07 Data 28 aprilie 2021 22:59:21
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;

int n, indice[200001], poz[200001],tata[200001];

void schimba(int a, int b)
 {
  swap(tata[a], tata[b]);
  swap(indice[a], indice[b]);
  poz[indice[a]] = a;
  poz[indice[b]] = b;
}

void urcare(int a)
{
  if (a == 1)
    return;

  if (tata[a / 2] > tata[a])
    {
    schimba(a, a / 2);
    urcare(a / 2);
  }
}

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

void rearanjare(int a) {
  if (a > 1 && tata[a / 2] > tata[a])
    {
    urcare(a);
  } else
  {
    coboarare(a);
  }
}
int main()
 {
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
  int element,ok, i=0,optiune,j;
  fin >> ok;
  while (ok!=0)
    {
    fin >> optiune;

    if (optiune == 1)
        {  fin>>element;
      i++;
      n++;
      tata[n] = element;
      indice[n] = i;
      poz[i] = n;
      urcare(n);
    }
    else if (optiune == 2)
        {
        fin>>element;
       j = poz[element];
      schimba(n, j);
      n--;
      rearanjare(j);
    }
    else
      fout << tata[1]<<"\n";

    ok--;
  }
 return 0;
}