Cod sursa(job #1577794)

Utilizator VicktorVictor Teodor Stoian Vicktor Data 23 ianuarie 2016 20:44:53
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>

using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

struct{
    int val,poz;
}H[200005];
int nr,v[200005],n,cod;

void combinare(int i){
int inf=H[i].val,p=H[i].poz;
    int fiu=2*i,tata=i;
    while(fiu<=nr){
        if(fiu+1<=nr && H[fiu].val>H[fiu+1].val) fiu++;
        if(H[fiu].val<inf){
            H[tata].val=H[fiu].val;
            v[H[tata].poz]=fiu;
            H[tata].poz=H[fiu].poz;
            v[H[fiu].poz]=tata;
            tata=fiu;
            fiu=tata*2;
            }
        else
                break;
    }
    H[tata].val=inf;
    H[tata].poz=p;
}

void inserare(int inf,int i){
    int tata,fiu;
    fiu=nr;
    tata=nr/2;
    while(inf<H[tata].val && tata>0){
        H[fiu].val=H[tata].val;
        v[i]=tata;
        H[fiu].poz=H[tata].poz;
        v[H[tata].poz]=fiu;
        fiu=tata;
        tata=fiu/2;
    }
   H[fiu].val=inf;
   H[fiu].poz=i;
}

int main()
{
    int inf;
    fin>>n;
    for(int i=1;i<=n;i++){
      fin>>cod;
      if(cod<3)
      {
          fin>>inf;
          if(cod==1)
            {
                nr++;
                v[nr]=nr;
                inserare(inf,nr);
            }
          else
          {
              H[v[inf]].val=H[nr].val;
              H[v[inf]].poz=H[nr].poz;
            v[nr--]=v[inf];
            combinare(v[inf]);
              v[nr+1]=0;
          }
      }
      else
          fout<<H[1].val<<'\n';

    }
    return 0;
}