Cod sursa(job #1005733)

Utilizator sunt_emoSunt emo sunt_emo Data 5 octombrie 2013 17:20:12
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <fstream>
#include <algorithm>

#define N 100010

int data[N], best[N], pred[N], res[N], n;

bool comp(int a, int b) { return data[a] < data[b]; }

int main()
{
    std::ifstream in("scmax.in");
    in >> n;
    for (int i = 1; i <= n; i++)
        in >> data[i];
    in.close();

    int top = best[1] = 1;
    pred[1] = 0;

    for (int i = 2; i <= n; i++)
    {
        int *p = std::lower_bound(best + 1, best + top + 1, i, comp);
        pred[i] = best[p - best - 1];
        *p = i;
        if (p == best + top + 1)
            top++;
    }

    int k = best[top];
    n = 0;
    while (k)
    {
        res[n++] = data[k];
        k = pred[k];
    }

    std::ofstream out("scmax.out");
    out << top << "\n";
    while (n--)
        out << res[n] << " ";
    out << "\n";
    out.close();
}