Cod sursa(job #2809971)

Utilizator teodortatomirTeodor Tatomir teodortatomir Data 28 noiembrie 2021 00:06:36
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#define MAXX 200001

using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int mark[MAXX];
pair <int,int> h[MAXX];
pair <int,int> swapp[2];
int n=1,m=1;
void erasee(int i){
  int x;

  x=2*i;
  h[i]=h[m-1];
  m--;
  if(x<m){
    swapp[0]=h[x];
    if(h[x-1]<swapp[0])
      swapp[0]=h[x-1];
    while(x<m && h[i]>swapp[0]){
      if(h[x]<h[x+1]){
        swapp[1]=h[i];
        h[i]=h[x];
        h[x]=swapp[1];
        i*=2;
      }
      else{
        swapp[1]=h[i];
        h[i]=h[x+1];
        h[x+1]=swapp[1];
        i*=2;
        i++;
      }
      x=2*i;
    }
  }
}
void add(int nr){
  int i;

  h[m].first=nr;
  h[m].second=n;
  n++;
  i=m;
  m++;
  while(i/2>0 && h[i]<h[i/2]){
    swapp[1]=h[i];
    h[i]=h[i/2];
    h[i/2]=swapp[1];
    i/=2;
  }
}
int main(){
  int intrebari,intrebare,a,i;

  fin>>intrebari;
  for(i=0;i<intrebari;i++){
    fin>>intrebare;
    if(intrebare==1 || intrebare==2){
      fin>>a;
      if(intrebare==1)
        add(a);
      else
        mark[a]=1;
    }
    else{
      while(mark[h[1].second]!=0)
        erasee(1);
      fout<<h[1].first<<'\n';
    }
  }
  return 0;
}