Cod sursa(job #1625796)

Utilizator catu_bogdan_99Catu Bogdan catu_bogdan_99 Data 2 martie 2016 20:42:03
Problema Subsecventa de suma maxima Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <cstdio>
#include <iostream>
using namespace std;

#define dim 100005
int v[dim], best[dim], elem[dim], poz[dim];

void afis( int i )
{
   if (poz[i] > 0)  afis(poz[i]);
   printf("%d ",v[i]);
}

int caut( int k, int dr ){

    int i = 0;
    int pas = (1<<17);

    while( pas ){
        if( i + pas <= dr && v[elem[i+pas]] < k ) i += pas;
        pas /= 2;
    }

    return i;

}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    int n, i, j, t, k, ma;

    scanf("%d",&n);
    for( i = 1; i <= n; ++i )
        scanf("%d",&v[i]);


    best[1] = elem[1] = ma = 1;


    for( i = 2; i <= n; ++i ){

        k = caut( v[i], ma );
        poz[i] = elem[k];
        elem[k+1] = i;
        best[i] = k + 1;

        if( k + 1 > ma ) ma++;

    }

    ma = 0;
    for( i = 1; i <= n; ++i ){
        if( ma < best[i] ){
            ma = best[i];
            k = i;
        }
    }

    printf("%d\n",ma);
    afis(k);

    return 0;
}