Cod sursa(job #814869)

Utilizator MikeysMihai Tiganus Mikeys Data 16 noiembrie 2012 12:18:19
Problema Subsir crescator maximal Scor 50
Compilator c Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>

int oceans[100001],ind_ultim_ssc[100001],rec[100001],sol[100001];

int caut_bin(int start,int end,int cur)
{
	int m=(start+end)/2;
	if(start>end) return 0;
	if(oceans[ind_ultim_ssc[m]]<=cur)
	{
		if(ind_ultim_ssc[m+1]==-1)
			return m;
		else if(oceans[ind_ultim_ssc[m+1]]>cur)
			return m;
		else caut_bin(m+1,end,cur);
	}
	else return caut_bin(start,m-1,cur);
}

int main()
{
	FILE *in=fopen("scmax.in","r");
	FILE *out=fopen("scmax.out","w");
	int n,i,j,smax;
	fscanf(in,"%d",&n);
	for(i=0;i<n;i++)
	{	
		fscanf(in,"%d",&oceans[i]);
		rec[i]=-1;
		ind_ultim_ssc[i]=-1;
	}
	ind_ultim_ssc[n]=-1;
	rec[n]=-1;
	smax=1;
	ind_ultim_ssc[1]=0;
	rec[0]=-1;
	for(i=1;i<n;i++)
	{
		j=caut_bin(0,smax,oceans[i]);
		if(j==0)	rec[i]=-1;
		else	rec[i]=j;
		if(j==smax || oceans[ind_ultim_ssc[j+1]]>oceans[i])
		{
			ind_ultim_ssc[j+1]=i;
			smax=smax>(j+1)?smax:(j+1);
		}
	}
	j=smax;
	i=smax;
	sol[--i]=ind_ultim_ssc[smax];
	while(rec[j]!=-1)
	{
		sol[--i]=rec[j];
		j=rec[j];
	}

	fprintf(out,"%d\n",smax);
	for(i=1;i<=smax;i++)
		fprintf(out,"%d ",oceans[ind_ultim_ssc[i]]);
		//printf("%d ",rec[i]);
	close(in);
	close(out);
	return 0;
}