Cod sursa(job #246247)

Utilizator ovy2906Popescu Ovidiu ovy2906 Data 20 ianuarie 2009 13:42:45
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.74 kb
#include<stdio.h>
int v[100005],n,x[100005],nr,pred[100005];
int find();
int lungime();
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]);
	printf("%d",lungime());
	return 0;
}
int find(int val){
	int p=1,u=nr,mij;
	while(p<u){
		mij=(p+u)/2;
		if(val<=v[x[mij]])
			u=mij;
		else
			p=mij+1;
	}
	if(x[p]<val)
		return p+1;
	return p;
}
int lungime(){
	nr=0;
	int p;
	x[++nr]=1,pred[1]=0;
	for(int i=2;i<=n;++i)
		if(v[i]>v[x[nr]]){
			x[++nr]=i;
			pred[i]=x[nr-1];
		}
		else{
			p=find(v[i]);
			x[p]=i;
			pred[i]=x[p-1];
		}
	return nr;
}
void refac(int p){
	if(p==0)
		return;
	refac(pred[p]);
	printf("%d ",v[p]);
}