Pagini recente » Cod sursa (job #391800) | Cod sursa (job #2658203) | Borderou de evaluare (job #391010) | Cod sursa (job #1398881) | Cod sursa (job #2167902)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
#define NMAX 100003
int N, K, Lmax, a[NMAX], st[NMAX], l[NMAX];
int Binary_search(int val)
{
int l, r, m; /// left, right, mij
l = 1, r = K;
if( val < st[1] )
return 0;
while( l <= r )
{
m = l + (r-l)/2;
if( st[m] < val && val <= st[m+1] ) return m;
else if( st[m] < val ) l = m+1;
else r = m-1;
}
st[++K] = val;
return K-1;
}
void LIS()
{
int pos;
K = 0;
for(int i = 1 ; i <= N ; ++i)
{
pos = Binary_search(a[i]);
l[i] = pos+1;
st[pos+1] = ( a[i] < st[pos+1] )? a[i]: st[pos+1] ;
}
Lmax = K;
for(int i = N ; i >= 1 && K != 0 ; --i)
if( l[i] == K ) st[K--] = a[i];
}
int main()
{
f >> N;
for(int i = 1 ; i <= N ; ++i)
f >> a[i];
LIS();
g << Lmax << '\n';
for(int i = 1 ; i <= Lmax ; ++i)
g << st[i] << ' ';
return 0;
}