Pagini recente » Cod sursa (job #2801995) | Cod sursa (job #2808302) | Cod sursa (job #2205936) | Cod sursa (job #3236444) | Cod sursa (job #2150882)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, v[100002], dp[100002], poz[100002], a[100002], maxI = 1, maxx;
vector<int> afis;
int lim = 1;
int cb( int x ){
int st = 0, dr = lim + 1, mid;
while( dr - st > 1 ){
mid = st + ( dr - st ) / 2;
if( a[mid] < x ) st = mid;
else dr = mid;
}
return st;
}
int main()
{
fin >> n;
for( int i = 1 ; i <= n ; ++i ){
fin >> v[i];
}
dp[1] = 1;
a[1] = v[1];
poz[1] = 0;
for( int i = 2 ; i <= n ; ++i ){
poz[i] = cb(v[i]);
dp[i] = cb(v[i]) + 1;
a[dp[i]] = v[i];
if( dp[i] > lim ) lim = dp[i];
if( dp[i] > maxx ){
maxx = dp[i];
maxI = i;
}
}
fout << maxx << "\n";
for( int i = 1 ; i <= n ; ++i ){
//fout << dp[i] << " ";
}
for( int i = maxI ; i ; i = poz[i] ){
afis.push_back(v[i]);
}
for( int i = afis.size() - 1 ; i >= 0 ; --i ){
fout << afis[i] << " ";
}
return 0;
}