Cod sursa(job #914211)

Utilizator ucnahHancu Andrei ucnah Data 13 martie 2013 22:47:09
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <cstdio>

using namespace std;
int n,a[100010],s1[100010],s2[100010],nr,nr1;
void prelucrare()
{
    int k=0;
    s1[++k]=a[1];
    s2[1]=1;
    for(int i=2;i<=n;i++)
    {
        int st=1,dr=k,poz=k+1;
        while(st<=dr)
        {
            int mij=(st+dr)/2;
            if(a[i]<=s1[mij])
            {
                poz=mij;
                dr=mij-1;
            }
            else
                st=mij+1;
        }
            if(poz<=k)
            {
                s1[poz]=a[i];
                s2[i]=poz;
            }
            else
            {
                s1[++k]=a[i];
                s2[i]=k;
            }
    }
    printf("%d\n",k);
    int p=k;
    for(int i=n;i>=0;i--)
        if(s2[i]==k)
        {
            s1[k]=a[i];
            k--;
        }
    for(int i=1;i<=p;i++)
        printf("%d ",s1[i]);
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    prelucrare();
    return 0;
}