Cod sursa(job #547855)

Utilizator bog29Antohi Bogdan bog29 Data 6 martie 2011 19:10:02
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include<fstream>
#include<vector>
#include<algorithm>
#define dmax 100003
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");

int n,x[dmax],aib[dmax],scm[dmax],m,pre[dmax],y[dmax],ult,z[dmax];

vector<int>v;
vector<int>::iterator it,ne;

void getsol(int k)
{	
	if(pre[k]!=0)
	{	getsol(pre[k]);
		out<<x[pre[k]]<<" ";
	}	
}


void norm()
{	
	sort(v.begin(), v.end() );
	ne=unique(v.begin(), v.end() );
	v.erase(ne, v.end() );
}

void update(int k)
{	
	int poz;

	poz=z[k]+1;
	
	aib[poz]=scm[k];
	y[poz]=k;
	
	while(poz < n && poz < dmax)
	{	
		poz+=(poz & -poz);
		if( (aib[poz]==0 || aib[poz] < scm[k]) && poz < dmax)
		{	aib[poz]=scm[k];
			y[poz]=k;
		}	
	}
}


int query(int k)
{	
	int poz, mx;
	
	poz=z[k];
	
	mx=aib[poz];
	pre[k]=y[poz];
	
	while(poz > 0)
	{	
		poz-=(poz & -poz);
		
		if(aib[poz] > mx)
		{	mx=aib[poz];
			pre[k]=y[poz];
		}	
	}

	return mx;
}	


int main()
{	
	int i;
	
	in>>n;
	
	for(i=1;i<=n;i++)
	{	
		in>>x[i];
		v.push_back(x[i]);
	}	
	in.close();
	
	norm();
	
	for(i=1;i<=n;i++)
	{	it=lower_bound(v.begin(), v.end(), x[i]);
		z[i]=it-v.begin();
	}	
	
	for(i=1;i<=n;i++)
	{		
		scm[i] = query(i)+1;
		update(i);
		
		if(scm[i] > m)
		{	m=scm[i];
			ult=i;
		}
	}
	
	out<<m<<'\n';
	
	getsol(ult);
	out<<x[ult];
	
	out.close();
	return 0;
}