Cod sursa(job #2693555)

Utilizator andrei_laurentiuRadu Andrei-Laurentiu andrei_laurentiu Data 6 ianuarie 2021 13:27:25
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int nmax = 100005;
int n;
vector<int> a, d, p, sol;

int main()
{
    int i, k = 1, x;
    fin>>n;

    a.push_back(0);

    for(i = 1; i <= n; ++i)
    {
        fin>>x;
        a.push_back(x);
    }

    p.assign(n + 1, 0);
    d.push_back(0);

    p[1] = 1;
    d.push_back(a[1]);

    for(i = 1; i <= n; ++i)
    {
        if(a[i] > d[k])
        {
            ++k;
            d.push_back(a[i]);
            p[i] = k;
        }
        else
        {
            if(a[i] < d[1])
            {
                d[1] = a[i];
                p[i] = 1;
            }
            else
            {
                int st = 1, dr = k, mij, poz = k + 1;
                while(st <= dr)
                {
                    mij = (st + dr) / 2;
                    if(a[i] <= d[mij])
                    {
                        poz = mij;
                        dr = mij - 1;
                    }
                    else
                        st = mij + 1;
                }

                d[poz] = a[i];
                p[i] = poz;
            }
        }
    }

    fout<<k<<'\n';
    int copie_k = k;

    for(i = n; i > 0; --i)
    {
        if(p[i] == k)
        {
            sol.push_back(a[i]);
            --k;
        }
    }

    for(vector<int> :: reverse_iterator it = sol.rbegin(); it != sol.rend(); ++it)
        fout<<*it<<' ';
    return 0;
}