Cod sursa(job #3319094)

Utilizator 1gbr1Gabara 1gbr1 Data 30 octombrie 2025 15:30:41
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#include <iostream>
#include <queue>
#include <bitset>
#include <stack>
#include <vector>
using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");
int a[100005],poz[100005];
int dp[100005];
int k=1;
int cb(int val) {
    int st=1,dr=k;
    int sol;
    while (st<=dr) {
        int mij=(st+dr)/2;
        if (dp[mij]>=val)
            sol=mij,dr=mij-1;
        else
            st=mij+1;
    }
    return sol;
}
int main() {
    int n;
    fin>>n;
    for (int i=1; i<=n; i++)
        fin>>a[i];
    dp[1]=a[1];
    poz[1]=1;
    for (int i=2; i<=n; i++) {
        if (dp[k]<a[i])
            dp[++k]=a[i],poz[i]=k;
        else {
            int pos=cb(a[i]);
            dp[pos]=a[i];
            poz[i]=pos;
        }
    }
    fout<<k<<"\n";
    stack<int> st;
    for (int i=1; i<=n; i++)
        if (poz[i]==k)
        {st.push(i);break;}

    for (int i=st.top()-1; i>=1; i--)
        if (a[i]<a[st.top()] and poz[i]==poz[st.top()]-1)
            st.push(i);

    while (!st.empty()) {
        fout<<a[st.top()]<<" ";
        st.pop();
    }
    return 0;
}