Cod sursa(job #2568579)

Utilizator 12222Fendt 1000 Vario 12222 Data 4 martie 2020 08:10:38
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

const int Nmax = 1e5 + 2;

int n, top;
int a[Nmax], st[Nmax], pos[Nmax], sol[Nmax];

int Caut_bin(int x)
{
    int l, r, m, p;
    l = 1;
    r = top;

    while(l <= r)
    {
        m = (l + r) / 2;
        if(st[m] >= x)
        {
            p = m;
            r = m - 1;
        }
        else l = m + 1;
    }

    return p;
}

int main()
{
    fin >> n;

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

    top = 1;
    st[top] =a[1];
    pos[1] = 1;

    int x;
    for(int i = 2; i <= n; i++)
    {
        if(a[i] > st[top])
        {
            st[++top] = a[i];
            pos[i] = top;
        }
        else if(a[i] < st[1])
        {
            st[1] = a[i];
            pos[i] = 1;
        }
        else
        {
            x = Caut_bin(a[i]);
            st[x] = a[i];
            pos[i] = x;
        }
    }

    fout << top << "\n";

    x = top;

    for(int i = n; i >= 1 && x; i--)
        if(pos[i] == x)
        {
            sol[x] = a[i];
            x--;
        }

    for(int i = 1; i <= top; i++)
        fout << sol[i] << " ";

    fin.close();
    fout.close();
    return 0;
}