Cod sursa(job #1908973)

Utilizator delia_99Delia Draghici delia_99 Data 7 martie 2017 11:15:24
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <cstdio>
#include <vector>

using namespace std;

const int NMAX=100000;

int n,i,crt;
int a[NMAX+5],bst[NMAX+5],prv[NMAX+5];
vector <int> sol;

int bs(int val)
{
    int i,step;
    for(step=1; step<crt; step<<=1);
    for(i=0; step; step>>=1)
        if(i+step<=crt && a[bst[i+step]]<val)
            i+=step;
    return i;
}

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

    scanf("%d",&n);

    for(i=1; i<=n; ++i)
        scanf("%d",&a[i]);

    for(i=1; i<=n; ++i)
    {
        int pos=bs(a[i]);
        bst[pos+1]=i;
        prv[i]=bst[pos];
        if(pos+1>crt)
            crt=pos+1;
    }

    printf("%d\n",crt);

    for(i=bst[crt]; i; i=prv[i])
        sol.push_back(a[i]);

    for(i=crt-1; i>=0; --i)
        printf("%d ",sol[i]);

    return 0;
}