Cod sursa(job #226726)

Utilizator andyciupCiupan Andrei andyciup Data 2 decembrie 2008 18:23:53
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<stdio.h>
#define N 100005

int m,n,v[N],x[N],pred[N],lung[N];

int caut(int a)
{
	int p=1,q=m,mid;
	while(p!=q)
	{
		mid=(p+q)/2;
		if(a<=v[x[mid]])
			q=mid;
		else
			p=mid+1;
	}
	if(v[x[p]]<a)
		++p;
	return p;
}

void subsir(int p){
	if(p==0) return;
	subsir(pred[p]);
	printf("%d ", v[p]);
}

int maxim(){
	int zero=1;
	for(int i=2; i<=n; ++i)
		if(lung[i]>lung[zero])
			zero=i;
	return zero;
}
void parcurg(){
	int poz;
	x[1]=1;
	pred[1]=0;
	lung[1]=1;
	m=1;
	for(int i=2; i<=n; ++i){
		poz=caut(v[i]);//x[poz]=pozitia celui mai mic elem din v, care a fost deja prel si e mai mare ca v[i]
		x[poz]=i;
		lung[i]=poz;
		pred[i]=x[poz-1];
		if(poz==m+1)
			++m;
	}
	printf("%d\n",m);
	poz=maxim();//poz va fi pozitia pe care se afla cea mai mare vloare din vectorul lung
	subsir(poz);
}

int main(){
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out", "w", stdout);
	scanf("%d", &n);
	for(int i=1; i<=n; ++i){
		scanf("%d", &v[i]);
	}
	parcurg();
	return 0;
}