Cod sursa(job #2570846)

Utilizator alex_braslasuBraslasu Alexandru alex_braslasu Data 4 martie 2020 19:39:26
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <climits>
#include <vector>

using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");

int n, i, j = 0, k = 0, sol, a[100010], p[100010], q[100010], s[100010];

int Caut(int st, int dr, int x)
{
    int r = INT_MAX;
    while (st <= dr)
    {
        int m = (st + dr) / 2;
        if (q[m] < x)
            st = m + 1;
        else
        {
            dr = m - 1;
            if (r == INT_MAX)
                r = m;
            else
            {
                if (q[m] < q[r])
                    r = m;
            }
        }
    }
    return r;
}

int main()
{
    f >> n;
    for (i = 1; i <= n; ++i)
    {
        f >> a[i];
        if (j == 0)
        {
            q[++j] = a[i];
            p[++k] = j;
        }
        else
        {
            sol = Caut(1, j, a[i]);
            if (sol != INT_MAX)
            {
                q[sol] = a[i];
                p[++k] = sol;
            }
            else
            {
                q[++j] = a[i];
                p[++k] = j;
            }
        }
    }
    g << j << '\n';
    for (i = j; i >= 1; --i)
    {
        while (i != p[k])
            --k;
        s[i] = a[k];
    }
    for (i = 1; i <= j; ++i)
        g << s[i] << " ";
    return 0;
}