Cod sursa(job #238850)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 3 ianuarie 2009 14:18:58
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<stdio.h>
FILE*fin=fopen("heapuri.in","r");
FILE*fout=fopen("heapuri.out","w");
#define nmax 200001
int heap[nmax],dim=0,val[nmax],d=0,w[nmax];
int n;
void insert(int x)
{
  int y;
  dim++;
  heap[dim]=x;y=dim;
  w[x]=dim;
  while(y/2&&val[heap[y]]<val[heap[y/2]])
  {
    heap[y]^=heap[y/2]^=heap[y]^=heap[y/2];
    w[heap[y]]^=w[heap[y/2]]^=w[heap[y]]^=w[heap[y/2]];
    y=y/2;
  }
}
void rec(int x)
{
  int nm=x,st=2*x,dr=st+1,vm=val[heap[x]];
  if(st<=dim&&val[heap[st]]<vm)
  {
    vm=val[heap[st]];
    nm=st;
  }
  if(dr<=dim&&val[heap[dr]]<vm)
  {
    vm=val[heap[dr]];
    nm=dr;
  }
  if(nm!=x)
  {
    heap[nm]^=heap[x]^=heap[nm]^=heap[x];
    w[heap[nm]]^=w[heap[x]]^=w[heap[nm]]^=w[heap[x]];
    rec(nm);
  }
}
void del(int x)
{
  int nx=w[x];
  w[heap[dim]]=nx;
  heap[nx]^=heap[dim]^=heap[nx]^=heap[dim];
  dim--;
  rec(nx);
}
int main()
{
  int i,op,x;
  fscanf(fin,"%d",&n);
  for(i=1;i<=n;i++)
  {
    fscanf(fin,"%d",&op);
    if(op==1)
    {
      d++;
      fscanf(fin,"%d",&val[d]);
      insert(d);
    }
    if(op==2)
    {
      fscanf(fin,"%d",&x);
      del(x);
    }
    if(op==3) fprintf(fout,"%d\n",val[heap[1]]);
  }
  fclose(fin);
  fclose(fout);
  return 0;
}