Cod sursa(job #2607937)

Utilizator AndreosAndrei Otetea Andreos Data 30 aprilie 2020 13:52:53
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <cstdio>

int n, v[100005], last[100005], pred[100005], sol[100005];
void print(int i)
{
    if(pred[i]>0)
        print(pred[i]);
    printf("%d ",v[i]);
}
int find(int x) {
    int st = 1, dr = n, m;
    while(st <= dr) {
        m = (st + dr) >> 1;
        if(v[last[m]] >= x)
            dr = m-1;
        else
            st = m+1;
    }
    return dr;
}

int main() {
    int i, l , pos, maxx=0;
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d", &n);
    for(i = 1; i <= n; ++i)
        scanf("%d", &v[i]);
    sol[1]=last[1]=l=1;
    for(i = 1; i <= n; ++i)
    {
        pos = find(v[i]);
        pred[i]=last[pos];
        sol[i]=pos+1;
        last[pos+1]=i;
        if(l<pos+1)
            l=pos+1;
    }
    maxx=pos=0;
    for(i=1;i<=n;++i)
        if(maxx<sol[i])
        {
            maxx=sol[i];
            pos=i;
        }
    printf("%d\n",maxx);
    print(pos);
    return 0;
}