Cod sursa(job #2001199)

Utilizator Vlad3108Tir Vlad Ioan Vlad3108 Data 15 iulie 2017 22:33:04
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <bits/stdc++.h>
#define LMAX 100005
using namespace std;
int n,len=1,v[LMAX],Max[LMAX],T[LMAX];
inline int bSearch(int i){
    int st=1,dr=len;
    while(st<=dr){
        int mij=(st+dr)>>1;
        if(v[Max[mij]]>=v[i]) dr=mij-1;
        else st=mij+1;
    }
    len=max(st,len);
    return st;
}
inline void Afis(int i){
    if(T[i]) Afis(T[i]);
    printf("%d ",v[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",&v[i]);
    for(int i=1;i<=n+1;++i)
        Max[i]=INT_MAX;
    Max[1]=1;T[1]=0;
    for(int i=2;i<=n;++i){
        int poz=bSearch(i);
        T[i]=Max[poz-1];
        Max[poz]=i;
    }
    for(int i=1;i<=n+1;++i)
        if(Max[i]==INT_MAX){
            printf("%d\n",i-1);
            Afis(Max[i-1]);
            return 0;
        }
}