Cod sursa(job #3354928)

Utilizator nicoleta_iancuIancu Nicoleta nicoleta_iancu Data 21 mai 2026 10:44:28
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include<fstream>
#include<iostream>
#include<vector>
#define inf 2000000000
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
vector<int>parent;
vector<int>v;
vector<int>rez;
const int NMAX= 100001;
pair<int,int> dp[NMAX];
void rec(int &poz){
    if(poz==-1){
        return;
    }
    rez.push_back(v[poz]);
    rec(parent[poz]);
}
int lungMax;
pair<int,int> cb(int valCrt,int poz){
    int st=1;
    int dr=poz;
    int mij;
    lungMax=0;
    pair<int,int> rez=make_pair(0,-1);
    while (st<=dr)
    {
        mij=(st+dr)/2;
        if(dp[mij].first<valCrt){
            rez=dp[mij];
            lungMax=mij;
            st=mij+1;
        }else{
            dr=mij-1;
        }
    }
    return rez;
    
}
int main(){
    int n;
    fin>>n;
    v.resize(n);
    for(int i=0;i<n;++i){
        fin>>v[i];
    }
    for(int i=0;i<=n;++i){
        dp[i]=make_pair(inf,-1);
    }
    vector<int>lung(n);
    parent.resize(n);
    parent[0]=-1;
    pair<int,int>answr;
    for(int i=0;i<n;++i){
        answr=cb(v[i],i);
        parent[i]=answr.second;
        lung[i]=1+lungMax;
        if(dp[lung[i]].first>v[i]){
            dp[lung[i]]=make_pair(v[i],i);
        }
    }
    int final=0;
    int maxi=0;
    for(int i=0;i<n;++i){
        if(lung[i]>maxi){
            final=i;
            maxi=lung[i];
        }
    }
    fout<<maxi<<"\n";
    rec(final);
    for(int i=rez.size()-1;i>=0;--i){

        fout<<rez[i]<<" ";
    }
    return 0;
}