Pagini recente » Cod sursa (job #1204860) | Cod sursa (job #709207) | Cod sursa (job #3128668) | Cod sursa (job #2725890) | Cod sursa (job #2205029)
#include <fstream>
#include <cstdio>
#include <vector>
#include <algorithm>
#define pb push_back
using namespace std;
int const NM = 1e5 + 7;
int v [NM] , v1 [NM], v2 [NM];
vector <int> sol;
inline int bsearch (int a , int n)
{
int m , from , to , found = 1;
from = 1;
to = n;
while(from <= to)
{
m = (from + to) >> 1;
if(v1 [m] >= a)
found = m , to = m - 1;
else
from = m + 1;
}
return found;
}
char const in [] = "scmax.in";
char const out [] = "scmax.out";
ifstream cin (in);
ofstream cout (out);
int main ()
{
int n , i , j , k = 0 ;
cin >> n;
for(i = 1 ; i <= n ; ++ i)
cin >> v [i];
for(i = 1 ; i <= n ; ++ i)
{
if(! k)
v1 [++ k] = v [i] , v2 [i] = 1;
else
{
if(v1 [k] < v [i])
v1 [++ k] = v [i] , v2 [i] = k;
else
{
int pos = bsearch (v [i] , k);
v2 [i] = pos;
v1 [pos] = v [i];
}
}
}
pair <int , int> mx;
for(i = n ; i >= 1 ; -- i)
if( v2 [i] > mx . first)
mx . first = v2 [i] , mx . second = i;
cout << mx . first << '\n' ;
sol . pb (v [mx . second]);
for(i = mx . second ; i >= 1 ; -- i)
{
if( v2 [i] == mx . first - 1)
{
-- mx . first;
sol . pb (v [i]);
}
}
reverse (sol . begin () , sol . end ());
for(i = 0 ; i < sol . size () ; ++ i)
cout << sol [i] << ' ' ;
return 0;
}