Cod sursa(job #337731)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 4 august 2009 19:20:48
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <stdio.h>
#define Nmax 100003

int l[Nmax],best[Nmax],prev[Nmax],a[Nmax];
int n,nr,poz,max;

void read(){
   int i;
	freopen("scmax.in","r",stdin);
   freopen("scmax.out","w",stdout);
   scanf("%d",&n);
   for(i=1;i<=n;++i) scanf("%d",&a[i]);
}

int caut_bin(int st,int dr,int x){
	int m;
   while(st<=dr){
   	m=st+(dr-st)/2;
      if(a[l[m]] < x && a[l[m+1]]>=x) return m;
      if(a[l[m]] < x) st=m+1;
      else dr=m-1;
   }
   return nr;
}

void solve(){
   int i;
   best[1]=1; l[1]=1;
   nr=1;
   for(i=2;i<=n;++i){
   	poz=caut_bin(0,nr,a[i]);
      prev[i]=l[poz];
      best[i]=poz+1;
      l[poz+1]=i;
      if(poz+1 > nr) nr=poz+1;
   }
   max=0;poz=0;
   for(i=1;i<=n;++i)
     if(best[i] > max) max=best[i], poz=i;
   printf("%d\n",max);
}

void write(int poz){
	if(prev[poz]>0) write(prev[poz]);
   printf("%d ",a[poz]);
}

int main(){
	read();
   solve();
   write(poz);
   return 0;
}