Cod sursa(job #1404883)

Utilizator andreey_047Andrei Maxim andreey_047 Data 28 martie 2015 17:10:20
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <cstdio>
#include <algorithm>
using namespace std;
int n,a[100001],dp[100001],poz[100001],v[100001],len;
inline int Bsearch(int x){
    int *p,poz;
 if(x == dp[len]) return len;
 else if(x > dp[len]) return len+1;
  p = upper_bound(dp+1,dp+len+1,x);
  poz = p - dp;
  if(dp[poz-1] == x) return poz-1;
  return poz;
}
inline int tell_me(int a[],int n){
 int i,x,lg;
 for(i=1;i<=n;i++)
    dp[i]=poz[i]=0;
  dp[1]=a[1];len = 1;poz[1]=1;
  for(i=2;i<=n;i++){
     x=Bsearch(a[i]);
     dp[x]=a[i];
     poz[i] = x;
     if(x > len)len=x;
  }lg=len;
  for(i=n;i>0;i--)
  if(poz[i]==lg){v[lg]=a[i];lg--;}
  return len;
}
int main()
{
    int i,big;
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for(i = 1; i <= n;i++)
     scanf("%d",&a[i]);
    big = tell_me(a,n);
    printf("%d\n",big);
    for(i = 1; i <= big; ++i)
     printf("%d ",v[i]);
    printf("\n");
    return 0;
}