Cod sursa(job #1363332)

Utilizator DorelBarbuBarbu Dorel DorelBarbu Data 26 februarie 2015 21:32:57
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#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 ]<<' ';
}