Cod sursa(job #3280737)

Utilizator Edi17roAnghel Eduard Edi17ro Data 27 februarie 2025 14:39:12
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int NMAX = 1e5 + 5;
int v[NMAX + 5];
int d[NMAX + 5];
int l[NMAX + 5];
int f;
int n;

int catare(int x)
{
    int pos = 0;

    for(int step = 1 << 20; step > 0; step >>= 1)
    {
        if(pos + step <= d[0] && d[pos + step] < x)
        {
            pos += step;
        }
    }

    return pos;
}

void solve()
{
    d[1] = v[1];
    d[0] = 1;
    l[1] = 1;
    f = 1;

    for(int i = 2; i <= n; ++i)
    {
        int pos = catare(v[i]);

        if(pos == d[0])
        {
            ++d[0];
        }

        d[pos + 1] = v[i];

        l[i] = pos + 1;

        if(l[i] > l[f])
            f = i;
    }

    int lungime = l[f];

    out << lungime << '\n';

    for(int i = f; lungime; --i)
    {
        if(l[i] == lungime)
        {
            d[lungime] = v[i];
            --lungime;
        }
    }

    for(int i = 1; i <= l[f]; ++i)
    {
        out << d[i] << ' ';
    }
}

int main()
{
    in >> n;

    for(int i = 1; i <= n; ++i)
    {
        in >> v[i];
    }

    solve();

    return 0;
}