Cod sursa(job #2571793)

Utilizator YetoAdrian Tonica Yeto Data 5 martie 2020 10:12:45
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <fstream>
using namespace std;
int n, i, j, k, maxim=-1, p;
int v[100001], dp[100001], tata[100001], poz[100001], sol[100001];
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");

int cautbin (int k, int x)
{
    int st=1, dr=k;
    while (st<=dr) {
        int mid = (st+dr)/2;
        if (v[poz[mid]]>=x)
            dr=mid-1;
        else
            st=mid+1;
    }

    return st;
}

int main () {
    fin>>n;
    for (i=1;i<=n;i++) {
        fin>>v[i];
    }
    k=1; poz[k]=1; tata[1]=0;
    for (i=2;i<=n;i++) {
        p=cautbin(k, v[i]);
        poz[p]=i;
        k=max(k, p);
        dp[i]=k;
        tata[i]=poz[p-1];
    }
    for (i=1;i<=n;i++) {
        if (dp[i]>maxim) {
            maxim=dp[i];
            p=i;
        }
    }
    fout<<maxim<<"\n";
    k=maxim;
    while (k>0) {
        sol[k]=v[p];
        k--;
        p=tata[p];
    }
    for (i=1;i<=maxim;i++)
        fout<<sol[i]<<" ";
    return 0;
}