Cod sursa(job #1371614)

Utilizator gapdanPopescu George gapdan Data 3 martie 2015 22:55:10
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <cstdio>
#define NMAX 100005

using namespace std;
int n;
int v[NMAX],sol[NMAX],L[NMAX];
int st,dr,poz,k;

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]);

    sol[1]=v[1];k=1;L[1]=1;
    for(int i = 2; i <= n; ++i)
    {
        if (v[i] > sol[k]) {++k;sol[k]=v[i];L[i]=k;}
        else
        {
            st=1;dr=k;poz=dr;
            while(st <= dr)
            {
                int mij=(st+dr)/2;
                if (sol[mij] < v[i]) st=mij+1;
                    else {dr=mij-1;poz=mij;}
            }
            sol[poz]=v[i];
            L[i]=poz;
        }
    }
       printf("%d\n",k);
       int j = 0;
    for (int i=n; i>0 && k;--i)
        if (L[i]==k) sol[++j]=v[i],--k;

    for (int i=j;i>0;--i)
        printf("%d ",sol[i]);
    return 0;
}