Pagini recente » Cod sursa (job #2690692) | Cod sursa (job #2649437) | Cod sursa (job #553428) | Cod sursa (job #1385289) | Cod sursa (job #2308608)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
int n, scm;
int v[100005];
int dp[100005];
int lmax[100005];
int ans[100005];
int binarySearch( int val, int pos )
{
int left = 1;
int right = pos;
int last;
while ( left <= right )
{
int mid = left+(right-left)/2;
if ( dp[mid] < val )
{
left = mid+1;
last = mid;
}
else
right = mid-1;
}
return last;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
fin>>n;
for ( int i = 1; i <= n; ++i )
{
fin>>v[i];
dp[i] = 2e9+1;
}
for ( int i = 1; i <= n; ++i )
{
int cur_len = binarySearch(v[i], scm);
dp[cur_len+1] = min(dp[cur_len+1], v[i]);
scm = max(scm, cur_len+1);
lmax[i] = cur_len+1;
}
int pos = scm;
int k = 0;
for ( int i = n; i >= 1; --i )
{
if ( pos == lmax[i] )
{
pos--;
ans[++k] = v[i];
}
}
fout<<k<<'\n';
for ( int i = k; i >= 1; --i ) fout<<ans[i]<<" ";
}