Cod sursa(job #727933)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 28 martie 2012 13:06:49
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include<stdio.h>
#define val 100010


int k , n  , V[val], Z[val], mij, x,poz,i,T[val];

FILE*f=fopen("scmax.in","r");
FILE*g=fopen("scmax.out","w");

int cautare(int nr){
	int st=1,dr=k;
	while(st<=dr){
		mij=(st+dr)/2;
		if(V[Z[mij]]>nr){
			dr=mij-1;
		}
		else{
			if(V[Z[mij+1]]>nr){
				poz=mij;
				return poz;
			}
			else{
				st=mij+1;
			}
		}
	}
	if(V[Z[mij]]>nr)
		mij--;
	return mij;
}

int main(){
	fscanf(f,"%d",&n);
	
	for(i=1;i<=n;i++)
		fscanf(f,"%d",&V[i]);
	
	Z[1]=1;k=1;
	
	for(i=2;i<=n;i++){
		x=cautare(V[i]);
		if(V[Z[x]]==V[i])
			continue;
		if(!x){
			Z[1]=i;
		}
		else{
			if(x<k){
				Z[x+1]=i;
			}
			else{
				Z[++k]=i;
				T[k]=V[Z[k-1]];
			}
		}
		
	}
	
	fprintf(g,"%d\n",k);
	
	for(i=2;i<=k;i++)
		fprintf(g,"%d ",T[i]);
	fprintf(g,"%d",V[Z[k]]);
	return 0;
}