Cod sursa(job #1379240)

Utilizator DenisacheDenis Ehorovici Denisache Data 6 martie 2015 17:08:00
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 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=0,R=ls,M;
    while (L<=R)
    {
        M=(L+R)>>1;
        if (x>v[s[M]] && x<=v[s[M+1]]) return M;
        else if (x>v[s[M+1]]) L=M+1;
        else R=M-1;
    }
    return ls;
}
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+1]=i;
        p[i]=s[poz];
        ls=poz+1;
        if (ls>lmax)
        {
            lmax=ls;
            pozmax=i;
        }
    }
    printf("%d\n",lmax);
    afis(pozmax);
    return 0;
}