Cod sursa(job #1363709)

Utilizator DorelBarbuBarbu Dorel DorelBarbu Data 27 februarie 2015 10:19:59
Problema Subsir crescator maximal Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 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();
    printf("%d",lgMax);
    //for(int i = 1; i <= N; i++)
        //cout<<best[ i ]<<' ';
}