Pagini recente » Cod sursa (job #938545) | Cod sursa (job #574262) | Cod sursa (job #353379) | Cod sursa (job #2275871) | Cod sursa (job #1363334)
#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();
for(int i = 1; i <= N; i++)
cout<<best[ i ]<<' ';
}