Cod sursa(job #546178)

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

int n,x[dmax],y[dmax],poz[dmax],scm[dmax],aib[dmax],r,pre[dmax],sir[dmax],ult,z[dmax];

int sf(int a, int b)
{	
	return (x[a] < x[b]);
}	

void update(int k)
{	int p,s; 

	p=scm[k];
	s=k;
	
	aib[poz[k]]=p;
	pre[poz[k]]=s;
	
	k=poz[k];
	
	while(k < n)
	{	
		k+=(k & -k);
		if(aib[k] < p || aib[k]==0)
		{	aib[k] = p;
			pre[k] = s;
		}	
	}	
}

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

	sir[s]=f;	
	return mx;
}	

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

int main()
{	
	int i;
	
	in>>n;
	for(i=1;i<=n;i++)
	{	in>>x[i];
		y[i]=i;
	}	
	in.close();
	
	sort(y+1, y+n+1, sf );
	
	for(i=1;i<=n;i++)
		poz[y[i]]=i;
	
	for(i=2;i<=n;i++)
		if(x[y[i]] != x[y[i-1]])
			z[i]=i-1;
		else z[i]=z[i-1];	
	
	for(i=1;i<=n;i++)
	{	scm[i]=query(i) + 1;
		update(i);
	}	

	for(i=1;i<=n;i++)
		if(scm[i] > r)
		{	r = scm[i];
			ult = i;
		}	
		
	out<<r<<'\n';
	
	getsol(ult);
	out<<x[ult];
	
	out.close();
	return 0;
}