//贪心加dp
#include<iostream>
using namespace std ;
const int N=1010;
int n;
int q[N];
int f[N];
int g[N];//存每个序列末尾的数字
int main() {
while(cin>>q[n]) n++;
int res=0;
for(int i=0; i<n; i++) {
f[i]=1;
for(int j=0; j<i; j++) {
if(q[j]>=q[i])
f[i]=max(f[i],f[j]+1);
res=max(res,f[i]);
}
}
cout<<res<<endl;
int cnt=0;//表示序列个数
for(int i=0; i<n; i++) {
int k=0;//表示已经遍历的序列的个数
while(k<cnt&&g[k]<q[i])//没有遍历完所有序列,而且序列最后小于q[i]
k++;//往后找
g[k]=q[i];//当上述循环结束的时候,要么遍历完所有数组,要么找到了小于的
if(k>=cnt) cnt++;//第一次k为0,cnt为0 所以直接 g[k]=q[i]
//因为此时k>=cnt 所以cnt++ 即有一个序列
}
cout<<cnt<<endl;
return 0;
}