Cod sursa(job #2439073)

Utilizator ArkhamKnightyMarco Vraja ArkhamKnighty Data 14 iulie 2019 20:59:07
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>

using namespace std;

ifstream cin("scmax.in");
ofstream cout("scmax.out");
const int inf = 1 << 30;
void citire(int a[], int& n)
{
    cin >> n;
    for(int i = 1 ; i <= n ; i++)
        cin >> a[i];
}

void rec(int n, int a[], int p[], int val)
{
    for(int i = n ; i ; --i)
        if(p[i] == val)
        {
            rec(i-1, a, p, val - 1);
            cout << a[i] << ' ';
            break;
        }

}

int cbin(int st, int dr, int val, int l[])
{
    while(st < dr)
    {
        int m = (st +dr) / 2;
        if(l[m] < val)
            st = m + 1;
        else dr = m;
    }
    return st;
}

int rez(int a[], int n, int l[], int p[])
{
    int sol = 0;
    for(int i = 1 ; i <= n ; i++)
    {
        l[i] = inf;

        int k = cbin(1, sol + 1, a[i], l);

        if(l[k] == inf)
            ++sol;

        l[k] = a[i];
        p[i] = k;
    }
    return sol;
}

int main()
{
    int n;
    int a[100005], l[100005], p[100005];
    citire(a,n);
    int sol = rez(a, n, l, p);
    cout << sol << '\n';
    rec(n, a, p, sol);
    return 0;
}