Cod sursa(job #2916224)

Utilizator carinamariaCarina Maria Viespescu carinamaria Data 28 iulie 2022 14:44:09
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int i, j, n, m, L, st, dr, mid, aux, k;
int v[100005], D[100005], t[100005], x[100005];
int main(){
    cin>>n;
    for(i=1;i<=n;i++){
        cin>>v[i];
    }
    /// sursa complexitate nlog(n)
    /// La un pas i avem L = lungimea maxima a unui subsir crescator cu elemente de pe pozitii <=i
    /// la pas i tinem un vector D cu L elemente (indici din v) in care
    /// v[D[j]] = val minima  dintre pozitiile 1 si i in care se termina un subsir crescator de lungime j
    for(i=1;i<=n;i++){
        if(v[i]>v[D[L]])
            D[++L]=i, t[D[L]]=D[L-1];
        else{
            st=1;
            dr=L;
            while(st<=dr){
                mid=(st+dr)/2;
                if(v[i]>v[D[mid]])
                    st=mid+1;
                else
                    dr=mid-1;
            }
            D[dr+1]=i;
            t[D[dr+1]]=D[dr];

        }
    }
    cout<<L<<"\n";
    aux=D[L];
    while(aux){
        x[++k]=aux;
        aux=t[aux];

    }
    for(i=k;i>=1;i--)
        cout<<v[x[i]]<<" ";




}