Cod sursa(job #904355)

Utilizator valiro21Valentin Rosca valiro21 Data 4 martie 2013 11:01:52
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <cstdio>
#define NMax 100002

using namespace std;

long n,v[NMax],m[NMax],x,j,fmaxx,p[NMax];

int bsearch(long in,long fn,long A[],long val) {
    long mid,p=fn;
    if(val<v[A[in]])
        return 0;
    while(in<=fn) {
        mid=(fn-in)/2+in;
        if(v[A[mid]]<val) {
            p=mid;
            in=mid+1;
        }
        else
            fn=mid-1;
    }

    return p;
}

void print(long poz) {
    if(poz==0)
        return ;
    print(p[poz]);
    printf("%ld ",v[poz]);
}

int main()
{
    freopen("scmax.in","rt",stdin);
    freopen("scmax.out","wt",stdout);

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

    for(long i=1;i<=n;i++) {
        x=v[i];
        j=bsearch(1,fmaxx,m,x);
        if(x<v[m[j+1]]||m[j+1]==0) {
            p[i]=m[j];
            m[j+1]=i;
            fmaxx = j+1>fmaxx ? j+1 : fmaxx;
        }
    }

    printf("%ld\n",fmaxx);

    print(m[fmaxx]);
    printf("\n");

    return 0;
}