Cod sursa(job #791443)

Utilizator SmarandaMaria Pandele Smaranda Data 24 septembrie 2012 09:53:57
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <cstdio>
using namespace std;
long x[100001];
long q[100001];
long p[100001];
long sol[100001];
long cautbin (long st  , long dr , long val) {
    long m,last=dr+1;
    while (st<=dr) {
        m=(st+dr)/2;
        if (q[m]>=val) {
            last=m;
            dr=m-1;
        }
        else st=m+1;
    }
    return last;
}

int main () {
    long n,i,u=0,j,max=-1,poz,k;

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

    scanf ("%ld",&n);
    for (i=1;i<=n;i++)
        scanf ("%ld",&x[i]);
    for (i=1;i<=n;i++) {
        k=cautbin (1,u,x[i]);
        q[k]=x[i];
        if (k>u)
            u++;
        p[i]=k;
        if (k>max) {
            max=k;
            poz=i;
        }
    }
    printf ("%ld\n",max);
    sol[++sol[0]]=x[poz];
    i=poz-1;
    max--;
    for (;i>=1;i--)
        if (p[i]==max) {
             max--;
             sol[++sol[0]]=x[i];
        }
    for (i=sol[0];i>=1;i--)
        printf ("%ld ",sol[i]);
    printf ("\n");
    return 0;
}