Pagini recente » Cod sursa (job #823188) | Cod sursa (job #1044967) | Cod sursa (job #1045140) | Cod sursa (job #823208) | Cod sursa (job #1363836)
#include <iostream>
#include <cstdio>
#include <deque>
using namespace std;
const int MAXN = 100000;
int N, s[MAXN+1], lgMax = 1, list[MAXN+1], best[MAXN+1], drum[MAXN+1], poz;
void citire()
{
scanf("%d",&N);
for(int i = 1; i <= N; i++)
scanf("%d",&s[ i ]);
}
int cautBin(int left, int right, int x)
{
int res = -1;
while( left <= right )
{
int m = ( left + right ) / 2;
if( list[ m ] < x )
{
res = m;
left = m + 1;
}
else right = m - 1;
}
return res;
}
void solve()
{
for(int i = 2; i <= N; i++)
{
if( s[ i ] > list[ lgMax ] )
{
list[ ++lgMax ] = s[ i ];
best[ i ] = lgMax;
//drum[ i ] = poz;
poz = i;
continue;
}
if( s[ i ] < list[ 1 ] )
{
list[ 1 ] = s[ i ];
best[ i ] = 1;
//drum[ i ] = i;
continue;
}
int p = cautBin(1,lgMax,s[ i ]);
list[ p + 1 ] = s[ i ];
best[ i ] = best[ p ] + 1;
//drum[ i ] = p;
}
}
deque <int> sol;
void getSolution()
{
sol.push_back( s[ poz ] );
lgMax--;
for(int i = N; i >= 1 && lgMax >= 1; i--)
{
if( best[ i ] == lgMax && s[ i ] < s[ poz ] )
{
sol.push_front( s[ 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();
list[ 1 ] = s[ 1 ]; best[ 1 ] = 1; //drum[ 1 ] = 1; poz = 1;
solve();
printf("%d\n",lgMax);
getSolution();
return 0;
}