Cod sursa(job #1027555)

Utilizator vladvaldezVlad Dimulescu vladvaldez Data 12 noiembrie 2013 20:58:04
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <stdio.h>
#include <utility>

using namespace std;
FILE *f=fopen("heapuri.in","r");
FILE *g=fopen("heapuri.out","w");
struct nod{
int x;
int y;
}h[2000005];
int n,m,i,ct,x,ii;

void combheap(int i,int n)
{
 int v=h[i].x;
 int tata=i;
 int fiu=2*i;
 while(fiu<=n)
 {
  if (fiu<n) if (h[fiu].x>h[fiu+1].x)fiu++;
  if (v>h[fiu].x)
   {
      h[tata]=h[fiu];
      tata=fiu;
      fiu=fiu*2;
   }
  else fiu=n+1;
 }
 h[tata].x=v;

}


void  cern (int n,int k)
{
int fiu=1;
while(fiu){
 fiu=0;
 if (2*k<=n){
  fiu=2*k;
  if(2*k+1<=n && h[2*k+1].x>h[2*k].x)fiu=2*k+1;
  if (h[fiu].x>h[k].x)fiu=0;
  if (fiu){swap(h[k],h[fiu]);k=fiu;}
 }
}

}

void urc(int n,int k)
{int nr=h[k].x;

  while((k>1) &&(h[k].x<h[k/2].x)) {
  h[k]=h[k/2];
  k=k/2;
  }

  h[k].x=nr;
  }



void cut(int &n,int k)
 {
   int tata=k/2;
   h[k]=h[n];
   n--;
 if ((k>1) && (h[k].x>h[tata].x)) urc(n,k);
    else cern(n,k);
}



void insert(int n,int xx)
{
 int fiu=++n;
 int tata=n/2;
 while(tata && h[tata].x>xx)
 {
  h[fiu]=h[tata];
  fiu=tata;
  tata=fiu/2;
 }
 h[fiu].x=xx;
 h[fiu].y=ct;
}

int extragmin(int &n)
{
 int v=h[1].x;
 h[1]=h[n];
 n--;
 combheap(1,n);
 return v;
}


int main()
{

ct=0;
fscanf(f,"%d",&n);

for(i=1;i<=n;i++)
{
 fscanf(f,"%d",&m);
 if (m==1){fscanf(f,"%d",&x);insert(ct,x);ct++;}
 else if (m==2){fscanf(f,"%d",&x);for(ii=1;ii<=ct;ii++)if (h[ii].y==x+1){cut(ii,n);break;}}
 else if (m==3)fprintf(g,"%d\n",extragmin(ct));
}



fclose(g);
return 0;
}