Cod sursa(job #2763931)

Utilizator rares89_Dumitriu Rares rares89_ Data 17 iulie 2021 20:47:48
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>

using namespace std;

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

int s[100005], v[100005], lg[100005];
int ant[100005], rez[100005];
int n, maxim;

int main() {
    fin >> n;
    for(int i = 1; i <= n; i++) {
        fin >> v[i];
    }
    fin.close();
    for(int i = 1; i <= n; i++) {
        int st = 1, dr = maxim, val = 0;
        while(st <= dr) {
            int m = (st + dr) / 2;
            if(v[s[m]] < v[i]) {
                val = m;
                st = m + 1;
            } else if(v[s[m]] >= v[i]) {
                dr = m - 1;
            }
        }
        lg[i] = val + 1;
        s[lg[i]] = i;
        if(lg[i] > maxim) {
            maxim = lg[i];
        }
        if(lg[i] == 1) {
            ant[i] = -1;
        } else if(lg[i] > 1) {
            ant[i] = s[lg[i] - 1];
        }
    }
    fout << maxim << "\n";
    int poz = s[maxim], poz1 = 1;
    while(poz != -1) {
        rez[poz1] = v[poz];
        poz1++;
        poz = ant[poz];
    }
    for(int i = poz1 - 1; i >= 1; i--) {
        fout << rez[i] << " ";
    }
    fout.close();
    return 0;
}