Cod sursa(job #2296695)

Utilizator TudorChirila11Tudor Chirila TudorChirila11 Data 4 decembrie 2018 22:30:30
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, m, i, j, v[100005], lmax, pred[100005], k, p[100005], best[100005], lastp, afis[100005];
int ok(int m, int l, int r, int key)
{
    return (v[p[m]]>=v[p[l]]&&v[p[m]]<key);
}
int cautbin(int l, int r, int key)
{
    while(l!=r)
    {
        int m=(l+r+1)/2;
        if(ok(m,l,r,key)) l=m;
        else r=m-1;
    }
    return l;
}
int main()
{
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>v[i];
    for(i=1;i<=n;i++)
    {
        int poz=cautbin(0,k,v[i]);
    ///    fout<<poz<<' ';
        best[i]=poz+1;
        if(k<=poz)
            k++;
        p[poz+1]=i;
        pred[i]=p[poz];
    ///fout<<k<<'\n';
       // for(j=1;j<=k;j++)
         //   fout<<p[j]<<' ';
        ///fout<<'\n';
    }
    for(i=1;i<=n;i++)
    if(best[i]>lmax)
    {
        lmax=best[i];
        lastp=i;
    }
    fout<<lmax<<'\n';
    k=0;
    while(lastp!=0)
    {
        k++;
        afis[k]=v[lastp];
        lastp=pred[lastp];
    }
    for(i=k;i>=1;i--)
        fout<<afis[i]<<' ';
    return 0;
}