Cod sursa(job #3248166)

Utilizator bogdan1479Luca Bogdan Alexandru bogdan1479 Data 10 octombrie 2024 22:08:27
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <stack>

using namespace std;

const int NMAX = 1e5 + 1;

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

int n, a[NMAX], d[NMAX], poz[NMAX], lg;

int cb(int x)
{
    int st = 1, dr = lg, mij, sol = 0;
    while(st <= dr)
    {
        mij = (st + dr) / 2;
        if(d[mij] > x)
        {
            sol = mij;
            dr = mij - 1;
        }
        else if(d[mij] < x)
            st = mij + 1;
        else
            return 0;
    }
    d[sol] = x;
    return sol;
}

int main()
{
    int x;
    fin >> n >> x;
    d[++lg] = a[1] = x;
    poz[1] = 1;
    for(int i = 2; i <= n; ++i)
    {
        fin >> x;
        if(x > d[lg])
        {
            d[++lg] = x;
            poz[i] = lg;
        }
        else
            poz[i] = cb(x);
        a[i] = x;
    }
    stack<int> sol;
    for(int i = lg, j = n; i > 0; --i)
    {
        while(poz[j] != i)
            --j;
        sol.push(j);
    }
    fout << sol.size() << '\n';
    while(!sol.empty())
    {
        fout << a[sol.top()] << ' ';
        sol.pop();
    }
    return 0;
}