Pagini recente » Cod sursa (job #2731930) | abcdefghijklmnopqrstuvwxyz | Cod sursa (job #281351) | Cod sursa (job #1497332) | Cod sursa (job #814869)
Cod sursa(job #814869)
#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;
}