Cod sursa(job #2491403)

Utilizator NoemikulcsarKulcsar Noemi Noemikulcsar Data 12 noiembrie 2019 15:56:01
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>

using namespace std;

const int NMAX = 1e5 + 5;
int n, v[NMAX], lis[NMAX], k, pos[NMAX], ans[NMAX];

int BinarySearch(int val)
{
    if (val > lis[k])
    {
        lis[++k] = val;
        return k;
    }
    int left = 1, right = k, mid, pos;
    while (left <= right)
    {
        mid = (left + right) / 2;
        if (lis[mid] >= val)
        {
            pos = mid;
            right = mid - 1;
        }
        else
            left = mid + 1;
    }
    lis[pos] = val;
    return pos;
}

int main()
{
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");
    fin >> n;
    for (int i = 1;i <= n;++i)
        fin >> v[i];
    for (int i = 1;i <= n;++i)
    {
        int p = BinarySearch(v[i]);
        pos[i] = p;
    }
    int pred = 2000000001, m = k;
    for (int i = n;i >= 1;--i)
    {
        if (pos[i] == m && v[i] < pred)
        {
            ans[m--] = v[i];
            pred = v[i];
        }
    }
    fout << k << "\n";
    for (int i = 1;i <= k;++i)
        fout << ans[i] << " ";
    fin.close();
    fout.close();
    return 0;
}