Cod sursa(job #1510452)

Utilizator adina0822Ciubotaru Adina-Maria adina0822 Data 24 octombrie 2015 23:41:40
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
using namespace std;
#include <fstream>
#define Maxn 200010
FILE *f=fopen ("heapuri.in", "r");
FILE *g=fopen ("heapuri.out", "w");

int N,L,NR;
int A[Maxn],Heap[Maxn],Pos[Maxn];

void push(int x)
{
    int aux;
    while(x/2 && A[Heap[x]]<A[Heap[x/2]])
    {
        aux=Heap[x];
        Heap[x]=Heap[x/2];
        Heap[x/2]=aux;

        Pos[Heap[x]]=x;
        Pos[Heap[x/2]]=x/2;
        x/=2;
    }
}

void pop(int x)
{
    int aux,y=0;
    while(x!=y)
    {
        y=x;
        if(y*2<=L && A[Heap[x]]>A[Heap[y*2]]) x=y*2;
        if(y*2+1<=L && A[Heap[x]]>A[Heap[y*2+1]]) x=y*2+1;
        aux=Heap[x];
        Heap[x]=Heap[y];
        Heap[y]=aux;

        Pos[Heap[x]]=x;
        Pos[Heap[y]]=y;
    }
}


int main()
{
  int i,x,cod;
  fscanf(f,"%d",&N);
  for(i=1; i<=N; i++)
  {
      fscanf(f,"%d",&cod);
      if(cod==1)
      {
          fscanf(f,"%d",&x);
          L++;
          NR++;
          A[NR]=x;
          Heap[L]=NR;
          Pos[NR]=L;

          push(L);
      }
      else if(cod==2)
      {
          fscanf(f,"%d",&x);
          A[x]=-1;
          push(Pos[x]);
          Pos[Heap[1]]=0;
          Heap[1]=Heap[L--];
          Pos[Heap[1]]=1;
          if(L>1)pop(1);

      }
      else fprintf(g,"%d\n",A[Heap[1]]);

  }

}