Pagini recente » Cod sursa (job #1045140) | Cod sursa (job #823208) | Cod sursa (job #1363836) | Cod sursa (job #532904) | Cod sursa (job #1366993)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <deque>
using namespace std;
const int MAXN = 100000;
int sir[MAXN+1], best[MAXN+1], last[MAXN+1], lgmax, N, poz;
void citire()
{
scanf("%d",&N);
for(int i = 1; i<= N; i++)
scanf("%d",&sir[ i ]);
}
int cautBin(int left, int right, int x)
{
int p = -1;
while( left <= right )
{
int m = ( left + right )/2;
if( last[ m ] < x )
p = max( m, p), left = m + 1;
else right = m - 1;
}
return p;
}
void solve()
{
best[ 1 ] = 1; last[ 1 ] = sir[ 1 ]; poz = 1;
for(int i = 1; i <= N; i++)
{
if( sir[ i ] > last[ lgmax ] )
lgmax++, last[ lgmax ] = sir[ i ], best[ i ] = lgmax, poz = i;
else if( sir[ i ] < last[ 1 ] )
best[ i ] = 1, last[ 1 ] = sir[ i ];
else
{
int p = cautBin( 1, lgmax, sir[ i ] );
last[ p + 1 ] = sir[ i ], best[ i ] = p + 1;
}
}
}
void printSol()
{
deque <int> sol;
int last = sir[ poz ];
sol.push_back( last );
lgmax--;
for(int i = poz; i >= 1; i--)
if( best[ i ] == lgmax && sir[ i ] < sir[ poz ] )
{
sol.push_front( sir[ i ] );
poz = i;
lgmax--;
}
for(int i = 0; i < sol.size(); i++)
printf("%d ",sol[ i ]);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
citire();
solve();
printf("%d\n",lgmax);
printSol();
return 0;
}