Cod sursa(job #330755)

Utilizator IoannaPandele Ioana Ioanna Data 11 iulie 2009 14:44:18
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include<stdio.h>
#include<string.h>
#define nmax 200010
long n,h[nmax],v[nmax],viz[nmax];

void read()
{
scanf("%ld",&n);
}

void ath()
{
long k,aux;
if (h[0]==0)
   {
    h[1]=v[v[0]];
    h[0]++;
    }
else {
      h[++h[0]]=v[v[0]];
      k=h[0];
      while (h[k/2]>v[v[0]] && k/2!=0)
            {
             aux=h[k];
             h[k]=h[k/2];
             h[k/2]=aux;
             k=k/2;
            }
     }
}

long search (long k)
{
long i;
viz[1]=1;
while (h[k]!=v[v[v[0]]])
      {
       if (2*k<=h[0])
          {
           if (h[2*k]<=v[v[v[0]]])
              if (!viz[2*k])
              {
               k=2*k;
               viz[k]=1;
              }
            else
           if (2*k+1<=h[0])
              if (h[2*k+1]<=v[v[v[0]]] && !viz[2*k+1])
                 {
                  k=2*k+1;
                  viz[k]=1;
                 }
              else k=k/2;
           else k=k/2;
          }
      }
return k;
}

void elim()
{
long p,k;
memset(viz,0,sizeof(viz));
p=search(1);
k=p;
while (2*k<=h[0])
      {
        if (2*k+1<=h[0])
              if (h[2*k]<h[2*k+1])
                 {
                  h[k]=h[2*k];
                  k=2*k;
                 }
              else {
                    h[k]=h[2*k+1];
                    k=2*k+1;
                   }
        else {
              h[k]=h[2*k];
              k=2*k;
              }
      }
h[0]--;
}

void op(long cod)
{
switch (cod)
       {
        case 1:{ath();break;}
        case 2:{elim();v[0]--;break;}
        case 3:{printf("%ld\n",h[1]);break;}
       }
}


void rez()
{
long i;
long cod;
for (i=1;i<=n;i++)
    {
     scanf("%ld",&cod);
     if (cod!=3)
         scanf("%ld",&v[++v[0]]);
     op(cod);
    }
}

int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
read();
rez();
return 0;
}