Cod sursa(job #2522588)

Utilizator ioanasIoana S ioanas Data 12 ianuarie 2020 18:14:31
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <vector>

using namespace std;

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

int main() {
    int n;
    in >> n;
    vector<int> a(n);
    for (int i = 0; i < n; ++i) in >> a[i];
    vector<int> best(n, -1);

    vector<int> r(n+1, -1);
    r[1] = 0;
    int pos = 1;
    for (int i = 1; i < n; ++i) {
        if (a[i] > a[r[pos]]) {
            best[i] = r[pos];
            r[++pos] = i;
        } else {
            int left = 1, right = pos;
            int place = -1;
            while (left <= right) {
                int mid = (left + right) / 2;

                if (mid == 1) {
                    if (a[i] < a[r[1]]) {
                        place = 1;
                        break;
                    }
                    left = mid+1;
                }

                if (a[i] == a[r[mid-1]]) break;
                else if (a[r[mid-1]] > a[i]) right = mid-1;
                else if (a[i] > a[r[mid-1]]) {
                    if (a[i] < a[r[mid]]) {
                        place = mid;
                        break;
                    }
                    left = mid+1;
                }
            }
            if (place != -1) {
                best[i] = r[place-1];
                r[place] = i;
            }
        }
    }

    out << pos << "\n";
    vector<int> sol;
    int crr = r[pos];
    while(crr != -1) {
        sol.push_back(a[crr]);
        crr = best[crr];
    }
    for (int i = sol.size()-1; i >= 0; --i)
        out << sol[i] << " ";
}