Cod sursa(job #2268769)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 25 octombrie 2018 11:56:56
Problema Heapuri Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include<cstdio>
using namespace std;
const int N=2005;
int h[N];
int v[N];
int poz[N];
int nh;
void schimba(int p,int q){
  swap(h[p],h[q]);
  poz[h[p]]=p;
  poz[h[q]]=q;
}
void urca(int p);
void adauga(int x);
void sterge(int p);
void coboara(int p);
void urca(int p){
  while(p>1 && v[h[p]]<v[h[p/2]]){
    schimba(p,p/2);
    p/=2;
  }
}
void adauga(int x){
  h[++nh]=x;
  poz[h[nh]]=nh;
  urca(nh);
}
void coboara(int p){
  int fs=2*p,fd=2*p+1,bun=p;
  if(fs<=nh && v[h[fs]]<v[h[bun]])
    bun=fs;
  if(fd<=nh && v[h[fd]]<v[h[bun]])
    bun=fd;
  if(bun!=p){
    schimba(bun,p);
    coboara(bun);
  }
}
void sterge(int p){
  if(p!=nh){
    schimba(p,nh);
    nh--;
    urca(p);
    coboara(p);
  }
  else
    nh--;
}
int main()
{
  FILE*fin,*fout;
  fin=fopen("heapuri.in","r");
  fout=fopen("heapuri.out","w");
  int a,n,i,tip,nra=0;
  fscanf(fin,"%d",&n);
  for(i=1;i<=n;i++){
    fscanf(fin,"%d",&tip);
    if(tip==1){
      fscanf(fin,"%d",&v[++nra]);
      adauga(nra);
    }
    if(tip==2){
      fscanf(fin,"%d",&a);
      sterge(poz[a]);
    }
    if(tip==3){
      fprintf(fout,"%d\n",v[h[1]]);
    }
  }
  return 0;
}