Cod sursa(job #2759807)

Utilizator un_fes_galbendaniel guba un_fes_galben Data 20 iunie 2021 16:53:58
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#include <algorithm>
using namespace std;
int s[100005],v[100005],lg[100005];
int ant[100005],rez[100005];
int main()
{
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");
    int n,a,i,st,dr,mij,val,max1=0;
    fin>>n;
    for(i=1;i<=n;i++){
        fin>>v[i];
        st=1;dr=max1;val=0;
        while(dr>=st){
            mij=(st+dr)/2;
            if(v[s[mij]]<v[i]){
                val=mij;
                st=mij+1;
            }
            else if(v[s[mij]]>=v[i]){
                dr=mij-1;
            }
        }
        lg[i]=val+1;
        s[lg[i]]=i;
        if(lg[i]>max1){
            max1=lg[i];
        }
        if(lg[i]==1){
            ant[i]=-1;
        }
        else if(lg[i]>1){
            ant[i]=s[lg[i]-1];
        }
    }
    fout<<max1<<'\n';
    int poz=s[max1],poz1=1;
    while(poz!=-1){
        rez[poz1]=v[poz];poz1++;
        poz=ant[poz];
    }
    for(int i=poz1-1;i>=1;i--){
        fout<<rez[i]<<" ";
    }
    fout<<'\n';
    return 0;
}