Cod sursa(job #1895015)

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

using namespace std;

const int N=100005;
int v[N],d[N],Ind[N],prev[N],L,Pos,p,last;
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]);
        prev[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);
    last=Ind[L];
    while(last!=0){
        st.push(v[last]);
        last=prev[last];
    }
    while(!st.empty()){
        printf("%d ",st.top());
        st.pop();
    }
    printf("\n");


    return 0;
}