Cod sursa(job #2772445)

Utilizator AlexZeuVasile Alexandru AlexZeu Data 1 septembrie 2021 11:02:09
Problema Subsir crescator maximal Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>
using namespace std;

const int mxN = 1e5 + 7;

int n, t[mxN], tata[mxN], v[mxN]; //t[i] = j -> reprezinta indicele(j) a ultimului element dintr - o secventa de lungime i
                       //r[i] = j -> indicele de unde provine j este i

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

void secventa(int poz) {
    if (poz == 0) {
        return;
    }
    secventa(tata[poz]);
    cout << v[poz] << " ";
}

int main() {
    ios::sync_with_stdio(false), fin.tie(nullptr), fout.tie(nullptr);
    fin >> n;
    for (int i = 1; i <= n; ++i) {
        fin >> v[i];
    }
    int m = 1;
    t[1] = 1;
    for (int i = 2; i <= n; ++i) {
        int st = 1, dr = m;
        while (st <= dr) {
            int mij = (st + dr) / 2;
            if (v[i] > v[t[mij]]) {
                st = mij + 1;
            } else {
                dr = mij - 1;
            }
        }
        if (st > m) {
            m++;
        }
        t[m] = i;
        tata[i] = t[m - 1];
    }
    fout << m << '\n';
    secventa(t[m]);
    return 0;
}