Cod sursa(job #2674793)

Utilizator Mihai_EduardMihai Eduard Mihai_Eduard Data 20 noiembrie 2020 10:49:30
Problema Subsir crescator maximal Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#define mx 100001
#define inf -200000000
using namespace std;

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

int n, v[mx], L[mx], T[mx];
int poz, st, p, l, f[mx], drum=inf;

void citire()
{
    fin>>n;
    for(int i=1;i<=n;i++)
        fin>>v[i];
    fin.close();
}

void rezolvare()
{
    for(int i=n;i>=1;i--)
    {
        if(drum==inf)
        {
            L[i]=1;
            T[i]=inf;
            drum=1;
            f[1]=i;
        }
        else
        {
            int poz=-1, x, y;
            for(int j=mx;j>=1;j--)
            {
                x=f[j];
                if(v[i]<v[x])
                {
                    poz=j;
                    break;
                }
            }
            if(poz==-1)
            {
                f[1]=i;
                L[i]=1;
                T[i]=inf;
            }
            else
            {
                L[i]=poz+1;
                x=f[poz];
                T[i]=x;
                y=poz+1;
                if(v[f[y]]<v[i])
                    f[y]=i;
            }
        }
        if(L[i]>drum)
            drum=L[i], st=i;
    }
}

void afisare()
{
    fout<<drum<<endl;
    while(T[st]!=inf)
    {
        fout<<v[st]<<' ';
        st=T[st];
    }
    fout<<v[st];
    fout.close();
}
int main()
{
    citire();
    rezolvare();
    afisare();
    return 0;
}