Cod sursa(job #2681193)

Utilizator satzaFoldesi Richard satza Data 5 decembrie 2020 09:44:52
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n, a[100002], lmax[100002], nr, p[100002], ans[100002];

int smallest_value_greater_than_ai(int l, int r, int x){
    if(l <= r){
        int mid = l + (r - l) / 2;
        if(x < lmax[mid]){
            if(mid == l or x >= lmax[mid - 1]) return mid;
            else r = mid - 1;
        }
        else l = mid + 1;
    }
    return l;
}

int main(){
    in >> n;
    for(int i = 1; i <= n; i++) in >> a[i];

    lmax[1] = a[1]; p[1] = 1; nr = 1;
    for(int i = 2; i <= n; i++){
        if(a[i] < lmax[1]){
            lmax[1] = a[i]; p[i] = 1;
        }
        else if(a[i] >= lmax[nr]){
            nr = nr + 1; lmax[nr] = a[i];
            p[i] = nr;
        }
        else{
            int poz = smallest_value_greater_than_ai(1, nr, a[i]);
            lmax[poz] = a[i]; p[i] = poz;
        }
    }
    out << nr << "\n";
    int poz = n;
    for(int i = nr; i >= 1; i--){
        while(p[poz] != i) poz = poz - 1;
        ans[i] = a[poz];
    }
    for(int i = 1; i <= nr; i++) out << ans[i] << " ";
    return 0;
}