Cod sursa(job #1909430)

Utilizator gapdanPopescu George gapdan Data 7 martie 2017 12:43:12
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <cstdio>
#define NMAX 1000005

using namespace std;

int n,v[NMAX],d[NMAX],L[NMAX],k;

int main()
{
    int st,dr,lastp;
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;++i) scanf("%d",&v[i]);
    k=1;L[1]=1;d[1]=v[1];
    for(int i=2;i<=n;++i)
    {
        if(v[i] > d[k]){
            ++k;
            L[i]=k;
            d[k]=v[i];
        }
        else{
            st=1;dr=k;lastp=dr;
            while(st <= dr){
                int mij=(dr+st)/2;
                if(d[mij] >= v[i]){dr=mij-1;lastp=mij;}
                    else st=mij+1;
            }
            d[lastp]=v[i];
            L[i]=lastp;
        }
    }
    printf("%d\n",k);
    int j=0;
    for(int i=n; i>=1 && k>0; --i)
    {
        if(L[i] == k)
        {
            --k;
            d[++j]=v[i];
        }
    }
    for(int i=j;i>=1;--i) printf("%d ",d[i]);
    return 0;
}