Cod sursa(job #2368680)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 5 martie 2019 17:12:56
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int NMAX = 100000 + 5;

int N, a[NMAX];
int best, t[NMAX];
int posBest, pv[NMAX];
vector <int> sol;

int BS(int val)
{
    int st = 1, dr = best, mid;

    while(st <= dr)
    {
        mid = (st + dr) / 2;

        if(a[t[mid]] < val)
            st = mid + 1;
        else
            dr = mid - 1;
    }

    return st;
}

int main()
{
    fin >> N;

    for(int i = 1; i <= N; i++)
        fin >> a[i];

    t[1] = 1, best = 1;

    for(int i = 2; i <= N; i++)
        {
            int k = BS(a[i]);
            t[k] = i;
            pv[i] = t[k - 1];
            best = max(best, k);
        }

    fout << best << '\n';

    int pos = t[best];
    while(pos != 0)
    {
        sol.push_back(a[pos]);
        pos = pv[pos];
    }

    for(int i = sol.size() - 1; i >= 0; i--)
        fout << sol[i] << ' ';

    return 0;
}