Cod sursa(job #1048690)

Utilizator alexclpAlexandru Clapa alexclp Data 6 decembrie 2013 11:37:51
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>

using namespace std;

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

const int N = 100005;

int n;
int nr;

int v[N];
int best[N], lung[N], poz[N];

int caut (int x)
{
    int p = 0, u = nr, m = (p+u)/2;
    while (p <= u) {
        if (v[lung[m]] < x &&  v[lung[m+1]] >= x) {
            return m;
        } else if (v[lung[m+1]] < x) {
          p = m + 1;
          m = (p + u)/2;
        } else {
            u = m - 1;
            m = (p + u)/2;
        }
   }
   return nr;
}

void afisare (int i)
{
    if (poz[i] > 0) {
        afisare(poz[i]);
    }
    out << v[i] << " ";
}

int main()
{
    in >> n;

    for (int i = 1; i <= n; i++) {
        in >> v[i];
    }
    int pozitie;
    nr = 1;
    best[1] = lung[1] = 1;
    lung[0] = 0;

    for (int i = 2; i <= n; i++) {
        pozitie = caut(v[i]);
        poz[i] = lung[pozitie];
        best[i] = pozitie + 1;
        lung[pozitie + 1] = i;
        if (nr < pozitie + 1) {
            nr = pozitie + 1;
        }
    }

    int maxim = 0;
    pozitie = 0;

    for (int i = 1; i <= n; i++) {
       if (maxim < best[i]) {
          maxim = best[i];
          pozitie = i;
       }
    }

    out << maxim << "\n";
    afisare(pozitie);

    return 0;
}