Cod sursa(job #1379205)

Utilizator DenisacheDenis Ehorovici Denisache Data 6 martie 2015 17:00:19
Problema Subsir crescator maximal Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <cstdio>
#include <algorithm>
using namespace std;
int v[100005],s[100005],p[100005],lmax,ls,n,pozmax;
int cb(int x)
{
    int L=1,R=ls,M;
    while (L<=R)
    {
        M=(L+R)>>1;
        if (M==ls)
        {
            if (x>v[s[M]]) return M+1;
            else if (x==v[s[M]]) return M;
            else return 1;
            continue;
        }
        if (x>=v[s[M]] && x<v[s[M+1]]) return M;
        else if (x<v[s[M]]) R=M-1;
        else L=M+1;
    }
    return ls+1;
}
void afis(int x)
{
    if (p[x]) afis(p[x]);
    printf("%d ",v[x]);
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for (int i=1;i<=n;i++) scanf("%d",&v[i]);
    s[1]=ls=lmax=pozmax=1;
    for (int i=2;i<=n;i++)
    {
        int poz=cb(v[i]);
        s[poz]=i;
        p[i]=s[poz-1];
        ls=poz;
        if (ls>lmax)
        {
            lmax=ls;
            pozmax=i;
        }
    }
    printf("%d\n",lmax);
    afis(pozmax);
    return 0;
}