Pagini recente » Cod sursa (job #1549806) | Cod sursa (job #504002) | Cod sursa (job #698505) | Cod sursa (job #1362490) | Cod sursa (job #2637880)
#include <iostream>
#include <fstream>
using namespace std;
const int N = 1e5;
int v[N+1], lis[N+1], true_parent[N+1];
int res[N+1];
ifstream in ( "scmax.in" );
ofstream out ( "scmax.out" );
int bs ( int x, int dr ) { /// cel mai mic v[lis[]] > x
int st = 1, poz = -1;
while ( st <= dr ) {
int mid = st + ( dr - st ) / 2;
if ( v[lis[mid]] >= x )
dr = mid - 1, poz = mid;
else
st = mid + 1;
}
return poz;
}
int main()
{
int n;
in >> n;
for ( int i = 1; i <= n; i ++ )
in >> v[i];
int k = 0;
for ( int i = 1; i <= n; i ++ ) {
if ( v[i] > v[lis[k]] )
lis[++k] = i, true_parent[i] = lis[k-1];
else {
int change = bs ( v[i], k );
true_parent[i] = lis[change-1];
lis[change] = i;
}
}
out << k << '\n';
int original_value = lis[k];
for ( int n_res = 1; n_res <= k; n_res ++ ) {
res[n_res] = v[original_value];
original_value = true_parent[original_value];
}
for ( int i = k; i; i -- )
out << res[i] << ' ';
return 0;
}