Cod sursa(job #2761706)

Utilizator Maftei_TudorMaftei Tudor Maftei_Tudor Data 3 iulie 2021 16:08:21
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>

using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");

int n, i, dp[100001], v[100001], ultim[100001], maxi, pre[100001], imax, pozi[100001];

int cb(int x, int n)
{
    int pw=1;
    while(pw<=n)
        pw*=2;
    pw/=2;
    int pos=0;
    while(pw)
    {
        if(pos+pw<=n)
            if(ultim[pos+pw]>x)
                pos+=pw;
        pw/=2;
    }
    return pos;
}

int main()
{
    fin>>n;
    for(int i=1; i<=n; i++)
        fin>>v[i];
    ultim[1]=v[n];
    pozi[1]=n;
    dp[n]=1;
    for(int i=n-1; i>=1; i--)
    {
        int poz=cb(v[i], n);
        if(poz==0)
        {
            dp[i]=1;
            if(ultim[1]<v[i])
            {
                pozi[1]=i;
                ultim[1]=v[i];
            }

        }
        else
        {
            dp[i]=poz+1;
            pre[i]=pozi[poz];
            if(v[i]>ultim[poz+1])
            {
                ultim[poz+1]=v[i];
                pozi[poz+1]=i;
            }
        }
        if(dp[i]>maxi)
        {
            maxi=dp[i];
            imax=i;
        }
    }
    fout<<maxi<<'\n';
    int i=imax;
    while(pre[i]!=0)
    {
        fout<<v[i]<<' ';
        i=pre[i];
    }
    fout<<v[i];
    return 0;
}