Cod sursa(job #1895018)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 27 februarie 2017 18:48:29
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <bits/stdc++.h>

using namespace std;

const int N=100005;
int v[N],d[N],Ind[N],last[N],L,Pos,p;
stack <int> st;

int Search(int x){
    p=0, Pos=1;
    while(Pos<L) Pos<<=1;

    while(Pos){
        if(p+Pos<=L and x>d[p+Pos]) p+=Pos;
        Pos>>=1;
    }
    return p;
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    int n,i;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&v[i]);
        p=Search(v[i]);
        last[i]=Ind[p];

        if(p+1>L or v[i]<d[p+1]){
            if(p+1>L) L=p+1;
            d[p+1]=v[i];
            Ind[p+1]=i;
        }
    }

    printf("%d\n",L);
    p=Ind[L];
    while(p!=0){
        st.push(v[p]);
        p=last[p];
    }
    while(!st.empty()){
        printf("%d ",st.top());
        st.pop();
    }
    printf("\n");


    return 0;
}