Cod sursa(job #2275068)

Utilizator RaresLiscanLiscan Rares RaresLiscan Data 2 noiembrie 2018 20:21:11
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>

using namespace std;

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

int v[100005], x[100005];
vector <pair <int, int> > V;
stack <int> s;

int firstDifferent (int n, int val)
{
    for (int i = n; i >= 0; i --) {
        if (V[i].first != val) return V[i].second;
    }
    return 0;
}

int binSearch (int s, int e, int val)
{
    if (s > e) return -1;
    int m = (s + e) / 2;
    if (V[m].first == val) return firstDifferent(m - 1, V[m].second);
    if (V[m].first < val) return binSearch(m + 1, e, val);
    return binSearch(s, m - 1, val);
}

bool cmp (pair <int, int> x, pair <int, int> y) {return x.first < y.first;}

int main()
{
    int n;
    fin >> n;
    int minim = 0x3f3f3f3f;
    for (int i = 1; i <= n; i ++) {
        fin >> v[i];
        V.push_back(pair <int, int> (v[i], i));
        if (v[i] < minim) minim = v[i];
    }
    sort(V.begin(), V.end(), cmp);
    x[1] = 1;
    int maxim = 0, poz = 0;
    for (int i = 2; i <= n; i ++) {
        if (v[i] > v[i - 1]) x[i] = x[i - 1] + 1;
        else if (v[i] == v[i - 1]) x[i] = x[i - 1];
        else x[i] = x[binSearch(0, n - 1, v[i])] + 1;
        if (x[i] > maxim) maxim = x[i], poz = i;
    }
    fout << maxim << "\n";
    int i = poz;
    while (i > 0) {
        s.push(v[i]);
        if (v[i] == minim) break;
        if (x[i - 1] == x[i]) {
            for (int j = i; j > 0; j --) {
                if (x[j] != x[i]) {
                    i = j;
                    break;
                }
            }
        }
        else if (x[i - 1] > x[i]) i = binSearch(0, n - 1, v[i]);
        else i --;
    }
    while (!s.empty()) {
        fout << s.top() << " ";
        s.pop();
    }
    return 0;
}