Cod sursa(job #890235)

Utilizator superman_01Avramescu Cristian superman_01 Data 24 februarie 2013 22:22:32
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<cstdio>
#include<vector>

#define NMAX 100005

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

using namespace std;

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

void read( void )
{
	
	fscanf(f,"%d",&N);
	int x;
	for(int i(1); i <= N ; ++i)
	{
		fscanf(f,"%d",&x);
		a.push_back(x);
	}
	
}

void solve( void )
{
	
	vector <int> p(a.size());
	int left,right;
	lis.push_back(0);
	
	for(int i(1) ; i < a.size();  ++i)
	{
		
		if(a[lis.back()] < a[i] )
		{
			p[i]=lis.back();
			lis.push_back(i);
			continue;
		}
		int mid=0;
		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[mid]] )
		{
			if (left > 0) p[i] = lis[left-1];
			lis[left] = i;
		}	
		
		
		
		
	}
	
	
	
	int v;
	for(int i=lis.size() , v=lis.back() ; i-- ; v=p[v])
		lis[i]=v;
	
}

void write( void )
{

	fprintf(g,"%d\n",lis.size());
	for(int i(0); i < lis.size() ; ++i )
		fprintf(g,"%d ",a[lis[i]] );
	
	
}



int main( void )
{
    read();
    solve();
	write();
	return 0;
	
	
}