Cod sursa(job #1895002)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 27 februarie 2017 18:38:31
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 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){
    if(L==0 or x<d[1]) return 0;
    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(d[p+1]==0 or v[i]<d[p+1]){
            d[p+1]=v[i];
            Ind[p+1]=i;
        }
        if(p+1>L){
            L=p+1;
            last=i;
        }
    }

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


    return 0;
}