Cod sursa(job #235573)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 24 decembrie 2008 15:04:53
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<stdio.h>
# define maxel 1000000005
struct Nod {
    int val;
    int intr;
};
int n;
int nh;
int t;
Nod heap[400005];
int sir[200005];
int x;
int Down(int p)
{
    int l = 2 * p;
    int r = 2 * p + 1;
    int poz = l;
    int min = heap[l].val;
   if (l > nh) return 0;
   if (r <= nh)
    if (min > heap[r].val)
          {
            min = heap[r].val;
            poz = r;
          }
    if (min < heap[p].val)
      {
          Nod aux;
          aux = heap[poz];
          heap[poz] = heap[p];
          heap[p] = aux;
          int ax;
          ax = sir[heap[poz].intr];
          sir[heap[poz].intr] = sir[heap[p].intr];
          sir[heap[p].intr] = ax;
          Down(poz);
      }
   return 0;
}
int Up(int x)
{
    Nod aux;
    while (heap[x/2].val > heap[x].val)
     {
         aux = heap[x/2];
         heap[x/2] = heap[x];
         heap[x] = aux;
         int ax;
         ax = sir[heap[x].intr];
         sir[heap[x].intr] = sir[heap[x/2].intr];
         sir[heap[x/2].intr] = ax;
         x /= 2;
     }
    return x;
}
int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);

    scanf("%d",&n);
    for(int i = 1; i <= n; i++)
    {
     scanf("%d",&t);
     if (t == 1)
      {
          scanf("%d",&x);
          nh++;
          heap[nh].val = x;
          heap[nh].intr = sir[0] + 1;
          sir[++sir[0]] = Up(nh);

      }
      if (t == 2)
      {
          scanf("%d",&x);
          heap[sir[x]].val = maxel;
          Down(sir[x]);
          nh--;
      }
      if (t == 3)
      {
          printf("%d \n",heap[1].val);

      }
    }
    return 0;
}