Cod sursa(job #2989775)

Utilizator Luka77Anastase Luca George Luka77 Data 6 martie 2023 23:14:35
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
#define FOR(WHATEVER) for(int i = 1; i <= WHATEVER; ++ i)
using namespace std;

/// INPUT / OUTPUT
const string problem = "scmax";
ifstream fin(problem + ".in");
ofstream fout(problem + ".out");

/// GLOBAL VARIABLES
const int NMAX = 1e5 + 5, MOD = 1e9 + 7, INF = 1e9;
int n;
int arr[NMAX], dp[NMAX], p[NMAX], idx[NMAX];

/// READING THE INPUT
int main()
{
    fin >> n;

    for(int i = 1; i <= n; ++ i)
        fin >> arr[i];

    int k = 1;
    dp[k] = arr[k];

    for(int i = 1; i <= n; ++ i)
    {
        if(arr[i] > dp[k])
        {
            dp[++k] = arr[i];
            p[i] = k;
        }
        else
        {
            int st = 1, dr = k, poz = k + 1;
            while(st <= dr)
            {
                int mid = (st + dr) / 2;
                if(arr[i] <= dp[mid])
                    poz = mid, dr = mid - 1;
                else
                    st = mid + 1;
            }
            dp[poz] = arr[i];
            p[i] = poz;
        }
    }
    int j = n;
    for(int i = k; i >= 1; --i)
    {
        while(p[j] != i)
            j--;
        idx[i] = j;
    }
    fout << k << '\n';
    for(int i = 1;  i <= k; ++ i)
        fout << arr[idx[i]] << ' ';
}