Pagini recente » Istoria paginii utilizator/aug08 | Istoria paginii utilizator/prodan1 | Cod sursa (job #1167419) | Cod sursa (job #1314468) | Cod sursa (job #1167333)
#include<cstdio>
#include<algorithm>
using namespace std;
const int NMAX = 100000+5;
const int INF = (1<<30);
void Read(),Solve(),Print();
int N,start,last;
int V[NMAX];
int T[NMAX];
int Best[NMAX];
int Solution[NMAX];
int main()
{
Read();
Solve();
Print();
return 0;
}
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",&V[i]);
}
void Solve()
{
int i,j;
for(i = 1; i <= N; i++)
{
T[i] = INF;
j = lower_bound(T+1, T+i+1, V[i]) - T;
T[j] = V[i];
if(Best[i-1] < j)
{
Best[i] = j;
start = i;
}
else Best[i] = Best[i-1];
}
Solution[Best[N]] = V[start];
last = start;
for(i = Best[N]-1, j = start-1; i && j; j--)
if(Best[j] == i && V[j] < V[last])
{
Solution[i] = V[j];
i--;
last = j;
}
}
void Print()
{
int i;
printf("%d\n",Best[N]);
for(i = 1; i <= Best[N]; i++)
printf("%d ",Solution[i]);
}