Cod sursa(job #2373953)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 7 martie 2019 16:09:23
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.84 kb
#include <bits/stdc++.h>

using namespace std;

int v[100010],n,tata[100010],v1[100010],poz[100010],d[100010];

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    int ans=0,wh,l=0,l1=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&v[i]);
    poz[++l]=1;
    d[1]=1;
    for(int i=2;i<=n;i++)
    {
        int st=0,dr=l;
        while(st<=dr)
        {
            int mid=(st+dr)/2;
            if(v[i]<=v[poz[mid]]) dr=mid-1;
            else st=mid+1;
        }
        d[i]=d[poz[dr]]+1;
        tata[i]=poz[dr];
        if(d[i]>ans) {ans=d[i];wh=i;}
        if(dr==l) poz[++l]=i;
        else if(v[i]<v[poz[dr+1]]) poz[dr+1]=i;
    }
    printf("%d\n",ans);
    for(;wh>0;wh=tata[wh]) v1[++l1]=wh;
    for(int i=l1;i>=1;i--) printf("%d ",v[v1[i]]);
    return 0;
}