Cod sursa(job #127228)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 23 ianuarie 2008 16:58:24
Problema Secventa Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include<stdio.h>
long int n,k,i,a,lh,val[500001],ind[500001],poz[500001],iu,id,vb,ps,pf,pswap,aux,aa;
void heapup(long int ic);
void heapdown(long int ic);
void swap(long int i1,long int i2);
int main()
{
	FILE *f,*g;f=fopen("secventa.in","r");g=fopen("secventa.out","w");
	fscanf(f,"%ld%ld",&n,&k);
	for(i=1;i<=k;i++){fscanf(f,"%ld",&a);lh++;val[lh]=a;ind[lh]=i;poz[i]=i;heapup(lh);}
	id=1;iu=k;vb=val[1];ps=1;pf=k;
	while(iu<n)
	{ fscanf(f,"%ld",&a);
	  pswap=poz[id];
	  id++;
	  iu++;
	  aa=val[pswap];
	  val[pswap]=a;
	  ind[pswap]=iu;
	  poz[iu]=pswap;
	  if(a<aa) {heapup(pswap);if(val[1]>vb){ps=id;pf=iu;vb=val[1];}}
	  else heapdown(pswap);
	}
	fprintf(g,"%ld %ld %ld\n",ps,pf,vb);
	fcloseall();
	return 0;
}
void heapup(long int ic)
{
	long int is;
	is=ic/2;
	if(is)
	 if(val[ic]<val[is])
	 {swap(is,ic);heapup(is);}
}
void heapdown(long int ic)
{
	long int is,is1;
	is=2*ic;is1=2*ic+1;
	if(is>lh)return;
	if(is<lh)if(val[is1]<val[is])is=is1;
	if(val[is]<val[ic]) { swap(is,ic);heapdown(is);}
}
void swap(long int i1,long int i2)
{
	aux=val[i1];val[i1]=val[i2];val[i2]=aux;
	aux=ind[i1];ind[i1]=ind[i2];ind[i2]=aux;
	poz[ind[i1]]=i1;poz[ind[i2]]=i2;
}