Cod sursa(job #719795)

Utilizator algotrollNume Fals algotroll Data 22 martie 2012 08:36:08
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<cstdio>
#include<stack>
#define _AMAX 100010

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    static int nA, A[_AMAX];
    scanf("%d",&nA);
    for (int i=1;i<=nA;i++)
        scanf("%d",&A[i]);
    static int M[_AMAX]; int L=0;
    static int prev[_AMAX];
    for (int i=1;i<=nA;i++)
    {
        //binary search for largest j<=L w/ A[M[j]]<A[x]
        int left=0, right=L, val=A[i],j=0;
        while (left<=right)
        {
            int mid=(left+right)/2;
            if (A[M[mid]]<val&&(mid==L||A[M[mid+1]]>=val)) {j=mid;break;}
            if (A[M[mid]]>=val) right=mid-1;
            else left=mid+1;
        }//got j
        prev[i]=M[j];
        if (j==L||A[i]<A[M[j+1]])
        {
            M[j+1]=i;
            if (j+1>L) L=j+1;
        }
    }
    std::stack<int> sol;
    int cur=M[L];
    while(cur!=0)
        {
            sol.push(A[cur]);
            cur=prev[cur];
        }
    printf("%d\n",L);
    while (!sol.empty())
    {
        printf("%d ",sol.top());
        sol.pop();
    }
    return 0;
}