Cod sursa(job #3183784)

Utilizator StefanPopescu2Popescu Stefan StefanPopescu2 Data 13 decembrie 2023 11:05:51
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <iostream>

#define N 100002
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");


int v[N];
int poz[N];
int q[N];

void afisare(int n, int l)
{
    int i;
    for (i = n; i >= 1; i--)
    {
        if (poz[i] == l) break;
    }

    if (l > 1) afisare(i - 1, l - 1);
    out << v[i] << ' ';
}

int main()
{
    int n; in >> n;
    for (int i = 1; i <= n; i++)
        in >> v[i];
    int l = 1;
    q[1] = v[1]; poz[1] = 1;
    for (int i = 2; i <= n; i++) {
        // q[1]<=       q[st]  |  q[dr].......q[l]
        //       < v[i]              >=v[i]
        if (v[i] > q[l])
        {
            l++;
            q[l] = v[i];
            poz[i] = l;
        }
        else
        { // v[i] < q[l]
            int st = 0, dr = l;
            while (st < dr - 1)
            {
                int m = (st + dr) / 2;
                if (v[i] <= q[m])
                    dr = m;
                else
                    st = m;
            }
            q[dr] = v[i];
            poz[i] = dr;

        }
    }
    out << l << endl;
    afisare(n, l);


    return 0;
}