Cod sursa(job #2921554)

Utilizator albertaizicAizic Albert albertaizic Data 31 august 2022 17:04:35
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX_N 200000
bool poz[MAX_N+1];
pair <int,int> heap[MAX_N+1];
int j,b;
void add(int i){
  while(i && heap[(i-1)/2].first>heap[i].first){
    swap(heap[i],heap[(i-1)/2]);
    i=(i-1)/2;
  }
}

void down(int i){
  int left,right,mmin;

  mmin=i;
  left=i*2+1, right=i*2+2;

  if(left<j && heap[left].first<heap[mmin].first)
    mmin=left;
  if(right<j && heap[right].first<heap[mmin].first)
    mmin=right;

  if(i!=mmin){
    swap(heap[i],heap[mmin]);
    down(mmin);
  }

}

void er(){
  heap[0]=heap[--j];
  down(0);
}
int main(){
    FILE *fin,*fout;
    int n,i,k,a;
    fin=fopen("heapuri.in","r");
    fout=fopen("heapuri.out","w");
    fscanf(fin,"%d",&n);
    b=j=0;
    for(i=0;i<n;i++){
      fscanf(fin,"%d",&k);
      if(k==1){
        fscanf(fin,"%d",&a);
        heap[j].first=a;
        heap[j].second=b;
        add(j);
        j++;
        b++;
      }else if(k==2){
        fscanf(fin,"%d",&a);
        poz[a-1]=1;
      }else{
        while(poz[heap[0].second])
          er();
        fprintf(fout,"%d\n",heap[0]);
      }
    }


    fclose(fout);
    return 0;
}