Cod sursa(job #1741946)

Utilizator danyvsDan Castan danyvs Data 15 august 2016 15:30:07
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100001;

int V[NMAX], n;
int Best[NMAX], lgmax;
int Father[NMAX];
int L[NMAX];
int nr;

void read()
{
    int i;
    fin >> n;
    for (i = 1; i <= n; ++ i)
        fin >> V[i];
}

int caut(int x)
{
    int lo, hi, mid;
    lo = 0;
    hi = lgmax;
    while (lo <= hi)
        {
         mid = lo + (hi - lo) / 2;
         if (V[L[mid]] < x && V[L[mid + 1]] >= x)
            return mid;
         else
            if (V[L[mid + 1]] < x)
                lo = mid + 1;
            else
                hi = mid - 1;
        }
    return lgmax;
}

void solve()
{
    int poz, i;
    lgmax = 1;
    L[0] = 0;
    Best[1] = L[1] = 1;
    for (i = 2; i <= n; ++ i)
        {
         poz = caut(V[i]);
         Father[i] = L[poz];
         Best[i] = poz + 1;
         L[poz + 1] = i;
         if (lgmax < poz + 1)
            lgmax = poz + 1;
        }
}

void reconstSol(int poz)
{
    if (poz == 0)
        return;
    reconstSol(Father[poz]);
    fout << V[poz] << " ";

}

void print()
{
    int i;
    fout << lgmax << "\n";
    for (i = 1; i <= n; ++ i)
        if (Best[i] == lgmax)
            {
             reconstSol(i);
             return;
            }
}

int main()
{
    read();
    fin.close();
    solve();
    print();
    fout.close();
    return 0;
}