Cod sursa(job #2969489)

Utilizator MihaiZ777MihaiZ MihaiZ777 Data 23 ianuarie 2023 11:42:14
Problema Subsir crescator maximal Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

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

int n;
int useless[100005];
int v[100005]; 
int bef[100005];
vector <int> ans;

int top;

int BinSearch(int num) {
    int lf = 1;
    int rg = top;
    int best = 0;

    while (lf <= rg) {
        int mid = (lf + rg) / 2;
        if (useless[v[mid]] < num) {
            lf = mid + 1;
            best = mid;
        }
        else {
            rg = mid - 1;
        }
    }
    return best;
}

int main() {
    fin >> n;
    for (int i = 1; i <= n; i++) {
        int x;
        fin >> x;
        useless[i] = x;

        int index = BinSearch(x);
        index++;
        v[index] = i;
        bef[i] = v[index - 1];
        if (index > top) {
            top++;
        }
    }

    fout << top << '\n';

    ans.push_back(useless[v[top]]);

    while (bef[v[top]]) {
        ans.push_back(useless[bef[v[top]]]);
        top = bef[top];
    }

    while (!ans.empty()) {
        fout << ans.back() << ' ';
        ans.pop_back();
    }
    fout << '\n';
}