Cod sursa(job #175500)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 9 aprilie 2008 23:36:43
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include<stdio.h>
long n,i,x[100001],poz[100001],vm[100001],dad[100001],st,dr,mi,lmax;
void afis(long pc);
int main()
{
	freopen("scmax.in","rt",stdin);
	freopen("scmax.out","wt",stdout);
	scanf("%ld",&n);
	for(i=1;i<=n;i++)scanf("%ld",&x[i]);
	lmax=1;poz[1]=1;vm[1]=x[1];
	for(i=2;i<=n;i++)
	{ if(x[i]>vm[lmax])
	  { lmax++;poz[lmax]=i;vm[lmax]=x[i];dad[i]=poz[lmax-1];continue;}
	  if(x[i]<=vm[1])
	  { poz[1]=i;vm[1]=x[i];dad[i]=0;continue;}
	  st=1;dr=lmax;
	  while(dr-st>1)
	  { mi=(st+dr)/2;
	    if(vm[mi]<x[i])st=mi;
	    else dr=mi;
	  }
	  if(x[i]<vm[dr])
	  { poz[dr]=i;vm[dr]=x[i];dad[i]=dad[dr];}
	}
	printf("%ld\n",lmax);
	afis(poz[lmax]);
	fcloseall();
	return 0;
}
void afis(long pc)
{
	if(!pc)return;
	afis(dad[pc]);
	printf("%ld ",x[pc]);
}