Cod sursa(job #1877341)

Utilizator bt.panteaPantea Beniamin bt.pantea Data 13 februarie 2017 11:25:09
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 100010
using namespace std;
ifstream f ("scmax.in");
ofstream g ("scmax.out");
int v[NMAX], best[NMAX], l[NMAX], p[NMAX], n, nr;

int caut(int x)
{
    int ls = 0, ld = nr, m = (ls + ld) / 2;
    while (ls <= ld)
    {
        if (v[l[m]] < x && v[l[m + 1]] >= x) return m;
        else if (v[l[m + 1]] < x)
        {
            ls = m + 1;
            m = (ls + ld) / 2;
        }
        else
        {
            ld = m - 1;
            m = (ls + ld) / 2;
        }
    }
    return nr;
}
void Write(int x)
{
    if (p[x] > 0) Write(p[x]);
    g<<v[x]<<' ';
}
int main()
{
    nr = 1;
    f>>n;
    for (int i = 1; i <= n; i++)
        f>>v[i];
    l[1] = best[1] = 1;
    l[0] = 0;

    for (int i = 2; i <= n; i++)
    {
        int poz = caut(v[i]);
        p[i] = l[poz];
        best[i] = poz + 1;
        l[poz + 1] = i;
        if (poz + 1 > nr) nr = poz + 1;
    }
    int maxim = 0, poz = 0;
    for (int i = 1; i <= n; i++)
        if (maxim < best[i])
        {
            maxim = best[i]; poz = i;
        }
    g<<maxim<<'\n';
    Write(poz);
    return 0;
}