Pagini recente » Diferente pentru problema/keymess intre reviziile 51 si 39 | Diferente pentru utilizator/vladdobro07 intre reviziile 30 si 29 | Diferente pentru problema/cautbin intre reviziile 31 si 30 | Diferente pentru utilizator/valentinolteanu intre reviziile 3 si 2 | Cod sursa (job #1363709)
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 100000;
int N, s[MAXN+1], lgMax = 1, last[MAXN+1], best[MAXN+1];
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( last[ m ] < x )
{
res = x;
left = m + 1;
}
else right = m - 1;
}
return res;
}
void solve()
{
for(int i = 2; i <= N; i++)
{
if( s[ i ] > last[ lgMax ] )
{
last[ ++lgMax ] = s[ i ];
best[ i ] = lgMax;
continue;
}
if( s[ i ] < last[ 1 ] )
{
last[ 1 ] = s[ i ];
best[ 1 ] = 1;
continue;
}
int p = cautBin(1,lgMax,s[ i ]);
last[ p + 1 ] = s[ i ];
best[ i ] = best[ p ] + 1;
}
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
citire();
last[ 1 ] = s[ 1 ];
solve();
printf("%d",lgMax);
//for(int i = 1; i <= N; i++)
//cout<<best[ i ]<<' ';
}