Cod sursa(job #1545520)

Utilizator enedumitruene dumitru enedumitru Data 6 decembrie 2015 20:13:10
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <cstdio> 
using namespace std; 
int n,m,i,poz,lgm,v[100001],lg[100001],b[100001]; 
int caut(int x) //CAUTARE BINARA POZITIA  CELUI MAI MARE NUMAR MAI MIC CA V[i] 
{	int m,p=1,u=b[0],mx=0; 
	while (p<=u) 
	{	m=(p+u)/2; 
		if(b[m]<x) 
		{	if(mx<m) mx=m; 
			p=m+1; 
		} 
		else u=m-1; 
	} 
	return mx; 
} 
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]); 
	b[1]=v[1]; b[0]=lg[1]=1;
	for(i=2;i<=n;++i) 
	{	poz=caut(v[i]); //cautare pozitie 
		if(poz==b[0]) b[0]++; 
		b[poz+1]=v[i]; //completare coada 
		lg[i]=poz+1; 
	} 
	for(poz=0,i=1;i<=n;++i) 
		if(lg[poz]<lg[i]) poz=i; 
	printf("%d\n",lg[poz]); 
	lgm=lg[poz];
	for(i=poz;lgm;--i)
		if(lg[i]==lgm) {b[++m]=v[i]; --lgm;};
	do printf("%d ",b[m--]); while(m);
	return 0; 
}