Cod sursa(job #1864419)

Utilizator tudormaximTudor Maxim tudormaxim Data 31 ianuarie 2017 19:12:10
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int maxn = 1e5 + 5;
int Best[maxn], Pre[maxn], V[maxn], maxx;

inline int Bin_search(int val) {
    int left = 1, right = maxx, mid;
    while (left <= right) {
        mid = (left + right) >> 1;
        if (V[Best[mid]] < val) {
            left = mid + 1;
        }
        else {
            right = mid - 1;
        }
    }
    return left;
}

void Secventa(int x) {
    if(Pre[x]) {
        Secventa(Pre[x]);
    }
    fout << V[x] << " ";
}

int main() {
    ios_base :: sync_with_stdio (false);
    int n, i, pos;
    fin >> n;
    for (i = 1; i <= n; i++) {
        fin >> V[i];
    }
    for (i = 1; i <= n; i++) {
        pos = Bin_search(V[i]);
        maxx = max(maxx, pos);
        Best[pos] = i;
        Pre[i] = Best[pos - 1];
    }
    fout << maxx << "\n";
    Secventa(Best[maxx]);
    fin.close();
    fout.close();
    return 0;
}