Cod sursa(job #723128)

Utilizator XladhenianGrigorita Vlad-Stefan Xladhenian Data 24 martie 2012 22:39:53
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
                                                     
#include <fstream>
using namespace std;

long M[200005];
long INX[200005];
long TIME[200005];
long HS;

void swap(long &a,long &b)
{
 long c = a;
 a = b;
 b = c;
}

void heapinsert(long T,long P)
{
 long s = HS;
 M[s] = T;
 INX[P] = s;
 TIME[s] = P;
 while ((s != 1) && (M[s / 2] > M[s]))
  {
   swap(M[s/2],M[s]);
   swap(INX[TIME[s/2]],INX[TIME[s]]);
   swap(TIME[INX[s/2]],TIME[INX[s]]);
   s = s / 2;
  }
 HS += 1;
}

void heapdelete(long s)
{
 M[s] = M[HS - 1];
 if (((s * 2) < HS) && (M[s * 2] < M[s * 2 + 1]))
   {
    M[s] = M[s * 2];
    swap(INX[TIME[s * 2]],INX[TIME[s]]);
    swap(TIME[INX[s * 2]],TIME[INX[s]]);
    heapdelete(s * 2);
   }
 if (((s * 2 + 1) < HS) && (M[s * 2] > M[s * 2 + 1]))
   {
    M[s] = M[s * 2 + 1];
    swap(INX[TIME[s * 2 + 1]],INX[TIME[s]]);
    swap(TIME[INX[s * 2 + 1]],TIME[INX[s]]);
    heapdelete(s * 2 + 1);
   }
}

int main(void)
{
 long N,O,T,i,P;
 fstream fin("heapuri.in",ios::in);
 fstream fout("heapuri.out",ios::out);
 fin >> N;
 HS = 1;
 P = 1;
 for (i = 0;i < N;i += 1)
  {
   fin >> O;
   if (O == 1)
     {
      fin >> T;
      heapinsert(T,P);
      P += 1;
     }
   if (O == 2)
     {
      fin >> T;
      heapdelete(INX[T]);
      HS -= 1;
     }
   if (O == 3)
     {
      fout << M[1] << "\n";
     }
  }
 fin.close();
 fout.close();
 return 0;
}