Cod sursa(job #2969492)

Utilizator MihaiZ777MihaiZ MihaiZ777 Data 23 ianuarie 2023 11:44:08
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 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';
    int lastIndex = v[top];
    ans.push_back(useless[lastIndex]);

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

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