Cod sursa(job #902917)

Utilizator superman_01Avramescu Cristian superman_01 Data 1 martie 2013 17:28:13
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<cstdio>
#include<vector>


FILE *f=fopen("scmax.in","r");
FILE *g=fopen("scmax.out","w");


using namespace std;


vector <int> a;
vector <int> lis;
int N;

void solve ()
{
	vector <int> p(a.size());
	if(a.empty())
		return ;
	int left,right;
	lis.push_back(0);
	
	for(int i(1); i <= a.size()-1; ++i )
	{
		
		if( a[lis.back()] < a[i] )
		{
			p[i]=lis.back();
			lis.push_back(i);
			continue;	
			
		}
		int mid;
		for( left=0 ,right=lis.size()-1; left<right; )
		{
			 mid=(left+right)/2;
			
			if( a[lis[mid]] < a[i] )
				left=mid+1;	
			else
				right=mid;
			
			
		}
		if(a[i] < a[lis[left]] )
		{
			
			if(left)	p[i]=lis[left-1];
				lis[left]=i;
		}
		
		
		
		
		
	}
	
	for(int i=lis.size(),v=lis.back();i--;v=p[v])
		lis[i]=v;
	
	
	
}

inline void write( void )
{
	fprintf(g,"%d",lis.size());
	for(int i=0; i<= lis.size() -1 ;++i )
		fprintf(g,"%d ",a[lis[i]]);
   fclose(f);
   fclose(g);
	
}



int main()
{
	fscanf(f,"%d",&N);
	int x;
	for(int i(1); i <= N; ++i )
		fscanf(f,"%d",&x),a.push_back(x);
	solve();
	write();
	return 0;
}