Cod sursa(job #2429818)

Utilizator MortemPlaiasu Iulia-Silvia Mortem Data 11 iunie 2019 12:07:19
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#define next pos*2+1
std::ifstream fin("heapuri.in");
std::ofstream fout("heapuri.out");

int v[200500];
int ind[200500];
int h[800500];
int n;
int sizeH;

void pushH(int a, int pos)
{
  if(pos==0)
    return;
  if(v[a]<v[h[pos/2]])
  {
    std::swap(h[pos],h[pos/2]);
    ind[h[pos]]=pos;
    ind[h[pos/2]]=pos/2;
    pushH(a,pos/2);
  }
}
void erase(int pos)
{
  h[pos]=0;
  if(h[next+1]==0&& h[next]==0)
    return;
  for(int i=0;i<2;i++)
    if(h[next+i]==0)
    {
      h[pos]=h[next+(i+1)%2];
      ind[h[next+(i+1)%2]]=pos;
      erase(next+(i+1)%2);
      return;
    }
  if(v[h[next+1]]<v[h[next]])
  {
    h[pos]=h[next+1];
    ind[h[next+1]]=pos;
    erase(next+1);
    return;
  }
  else
  {
    h[pos]=h[next];
    ind[h[next]]=pos;
    erase(next);
    return;
  }
}

void write()
{
  int pow2=2;
  for(int i=0;i<sizeH;i++)
  {
    std::cout<<v[h[i]]<<" ";
    if((i+2)%pow2==0)
    {
      std::cout<<"\n";
      pow2=pow2*2;
    }
  }
  std::cout<<"\n";
}

int main()
{
  fin>>n;
  int elem=0;
  for(int i=1;i<=n;i++)
  {
    int c,j;
    fin>>c;
    if(c==1)
    {
      fin>>j;
      elem++;
      v[elem]=j;
      h[sizeH]=elem;
      ind[elem]=sizeH;
      pushH(elem,sizeH);
      sizeH++;
    }
    else if(c==2)
    {
      fin>>j;
      erase(ind[j]);
    }
    else
      fout<<v[h[0]]<<"\n";
  }
}