Cod sursa(job #1807287)

Utilizator AlexVulpoiuAlexandru Vulpoiu AlexVulpoiu Data 16 noiembrie 2016 12:15:34
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <cstdio>
using namespace std;
int n,i,j,k,p,st,dr,a[100001],b[100001],c[100001];
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]);
    b[n]=1;
    c[1]=a[n];
    b[0]=1;
    p=n;
    for(i=n-1;i>=1;i--)
    {
        if(a[i]>c[1])
        {
            c[1]=a[i];
            b[i]=1;
        }
        else
            if(a[i]<c[b[0]])
            {
                c[b[0]+1]=a[i];
                b[i]=b[0]+1;
                b[0]++;
                p=i;
            }
            else
            {
                st=1;
                dr=b[0];
                while(st<=dr)
                {
                    k=(st+dr)/2;
                    if(c[k]>a[i] && c[k+1]<=a[i])
                    {
                        b[i]=k+1;
                        c[k+1]=a[i];
                        break;
                    }
                    else
                    if(a[i]>c[k])
                        dr=k-1;
                    else
                        st=k+1;
                }
            }
    }
    //for(i=1;i<=n;i++)
    //    printf("%d ",b[i]);
    //printf("\n");
    printf("%d\n",b[0]);
    while(b[0])
    {
        printf("%d ",a[p]);
        for(j=p+1;j<=n;j++)
            if(b[j]==b[0]-1)
            {
                p=j;
                break;
            }
        b[0]--;
    }
    printf("\n");
    return 0;
}