Cod sursa(job #2415978)

Utilizator mihneacazCazacu Mihnea mihneacaz Data 26 aprilie 2019 17:54:18
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <algorithm>
#include <vector>

const int NMAX=100005;

using namespace std;

ifstream cin ("scmax.in");
ofstream cout ("scmax.out");

int v[NMAX],pref[NMAX];
pair <int,int> dp[NMAX];
int main()
{
    ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
    int n;
    cin>>n;
    int sol=0;
    for(int i=1; i<=n; ++i){
        cin>>v[i];
        int st=1;
        int dr=sol;
        int best=0;
        while(st<=dr){
            int mij=(st+dr)>>1;
            if(dp[mij].first<v[i]){
                best=mij;
                st=mij+1;
            }
            else
                dr=mij-1;
        }
        ++best;
        dp[best].first=v[i];
        dp[best].second=i;
        pref[i]=dp[best-1].second;
        sol=max(sol,best);
    }
    cout<<sol<<'\n';
    vector <int> ans;
    int curr=dp[sol].second;
    while(curr>0){
        ans.push_back(v[curr]);
        curr=pref[curr];
    }
    reverse(ans.begin(),ans.end());
    for(auto x: ans)
        cout<<x<<" ";
    cout<<'\n';
    return 0;
}