Cod sursa(job #3208022)

Utilizator Sabin1133Padurariu Sabin Sabin1133 Data 27 februarie 2024 14:12:57
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>

void read_input(int &n, std::vector<int> &vec)
{
    std::ifstream fin("scmax.in");

    fin >> n;
    vec.resize(n);

    for (int i = 0; i < n; ++i)
        fin >> vec[i];

    fin.close();
}

void print_output(int len, int index, std::vector<int> &p, std::vector<int> &v)
{
    std::ofstream fout("scmax.out");

    std::stack<int> st;

    fout << len << '\n';

    while (p[index] != -1) {
        st.push(v[index]);
        index = p[index];
    }

    fout << v[index] << ' ';
    while (!st.empty()) {
        fout << st.top() << ' ';
        st.pop();
    }
    fout << '\n';

    fout.close();
}

int bsearch_ls(std::vector<int> &ls, std::vector<int> &v, int x)
{
    int l, r, m;

    l = 0;
    r = ls.size() - 1;
    m = (l + r) / 2;

    while (l < r) {
        if (x < v[ls[m]])
            r = m;
        else if (x > v[ls[m]])
            l = m + 1;
        else
            // se introduc si duplicate
            return m + 1;

        m = (l + r) / 2;
    }

    return m;
}

int main()
{
    int n;
    int ls_index = 0;
    std::vector<int> v;
    std::vector<int> p;
    std::vector<int> ls;

    read_input(n, v);

    p.resize(n, -1);
    p[0] = -1;
    ls.push_back(v[0]);

    for (int i = 1; i < n; ++i) {
        if (v[i] >= ls.back()) {
            ls.push_back(v[i]);
        } else {
            ls_index = bsearch_ls(ls, v, v[i]);
            ls[ls_index] = i;

            if (ls_index > 0)
                p[i] = ls[ls_index - 1];
        }
    }

    // print_output(ls.size(), ls.back(), p, v);

    return 0;
}