Cod sursa(job #1997239)

Utilizator DenisacheDenis Ehorovici Denisache Data 3 iulie 2017 19:20:22
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <array>

using namespace std;

/*void printVec(vector<int> vec, int len) {
    for (auto it = vec.begin(); it != vec.begin() + len; ++it) {
        cout << *it << " ";
    }
    cout << endl;
}*/

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

array<int, 100005> T;
vector<int> vec;

void printSol(int index) {
    if (T[index] != -1) {
        printSol(T[index]);
    }

    g << vec[index] << " ";
}

int main() {
    ios::sync_with_stdio(false);

    int n;

    f >> n;

    for (int i = 0; i < n; i++) {
        int x;
        f >> x;
        vec.push_back(x);
    }

    vector<int> lis;
    lis.push_back(0);

    int maxLen = 1, len = 1, indexSol = 0, i = 1;

    T.fill(-1);

    for (auto val = vec.begin() + 1; val != vec.end(); ++val) {

        auto pos = lower_bound(lis.begin(), lis.end(), *val,
                               [](const int &x, const int &y) {
                                    return vec[x] < y;
                               });

        if (pos == lis.end()) {
            lis.push_back(i);
            pos = lis.end() - 1;
        }
        else {
            *pos = i;
        }

        int intPos = pos - lis.begin();
        len = intPos + 1;
        if (intPos >= 1) {
            T[i] = lis[intPos - 1];
        }

        //printVec(lis, len);

        if (len > maxLen) {
            maxLen = len;
            indexSol = i;
        }

        ++i;
    }

    g << maxLen << "\n";

    printSol(indexSol);

    return 0;
}