Cod sursa(job #729053)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 29 martie 2012 11:02:16
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 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");

void afisare(int p){
	if(p){
		afisare(T[p]);
		fprintf(g,"%d ",V[p]);
	}
}

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<k)
			Z[x+1]=i;
		else
			Z[++k]=i;
		T[i]=Z[x];
	}
	
	fprintf(g,"%d\n",k);
	
	afisare(Z[k]);
	
	return 0;
}