Cod sursa(job #1914114)

Utilizator ana-maria.simiAna-Maria Simionescu ana-maria.simi Data 8 martie 2017 15:35:40
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
using namespace std;
int v[200001],ord[200001],poz[200001],s,i,nr,n,x,c;

void INSERT(int x, int k)
{
    v[k]=x;
    ord[k]=s;
    poz[ord[k]]=k;
    while(k>1 && v[k]<v[k/2])
    {
        swap(v[k],v[k/2]);
        poz[ord[k]]=k/2;
        poz[ord[k/2]]=k;
        swap(ord[k],ord[k/2]);
        k=k/2;
    }
}

void DELETE(int k)
{
    v[k]=v[nr];
    poz[ord[nr]]=k;
    ord[k]=ord[nr];
    nr--;
    while(k<=nr/2 && (v[k]>v[2*k] || (2*k+1<=nr && v[k]>v[2*k+1])))
    {
        int ind;
        if(2*k+1>nr || v[2*k]<v[2*k+1])
            ind=2*k;
        else
            ind=2*k+1;
        swap(v[k], v[ind]);
        poz[ord[k]]=ind;
        poz[ord[ind]]=k;
        swap(ord[k], ord[ind]);
        k=ind;
    }
}

int main()
{
  freopen("heapuri.in", "r", stdin);
  freopen("heapuri.out", "w", stdout);
  scanf("%d", &n);
  for(i=1; i<=n; i++)
  {
     scanf("%d", &c);
      if(c==1)
      {
          scanf("%d", &x);
          nr++;
          s++;
          INSERT(x,nr);
      }
      else
        if(c==2)
      {
          scanf("%d", &x);
          DELETE(poz[x]);
      }
      else
        if(c==3)
            printf("%d\n", v[1]);
  }
    return 0;
}