Cod sursa(job #262989)

Utilizator horiama1Mania Horia horiama1 Data 19 februarie 2009 20:14:22
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<stdio.h> 
int st,dr,x[100000],t,pred[100000],n,i,j=0,v[100000],rez[100000];
/*void cauta(int w[],int &st,int dr,int dc)
{
	int m; 
	while(st<dr)
	{  
		m=(st+dr)/2;  
		if(dc<=w[m])  
			dr=m;  
		else  
			st=m+1;  
	}
}*/
int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&v[i]);
	for(i=1;i<=n;i++)
	{
		if(v[i]>v[x[j]])
		{
			x[j+1]=i;
			pred[i]=x[j];
			j++;
			continue;
		}
		/*if(v[i]<=v[x[1]])
		{
			x[1]=i;
			pred[i]=0;
			continue;
		}*/
		st=1;
		dr=j;
		int m;
		while(st<dr)
	{  
		m=(st+dr)/2;  
		if(v[i]<=v[x[m]])  
			dr=m;  
		else  
			st=m+1;  
	}
		if(v[x[st]]<v[i]);
			st++;
		if(v[x[st]]==v[i])
		{
			x[st]=i;
			pred[i]=x[st-1];
		}
		else
		{
			x[st-1]=i;
			pred[i]=x[st-2];
		}
	}
	printf("%d\n",j);
	t=j;
	for(i=j;i>0;i--)
	{
		rez[i]=v[x[j]];
		x[j]=pred[x[j]];
	}
	for(i=1;i<=j;i++)
		printf("%d ",rez[i]);
	return 0;
}