Cod sursa(job #2832992)

Utilizator DordeDorde Matei Dorde Data 14 ianuarie 2022 16:18:26
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int const N = 1e5 + 3;
int n , v[N] , v2[N] , dp[N] , fr[N] , init[N];
int lg;
struct aib{
    #define z(x) ((x)&(-x))
    int v[N];
    aib(){
        fill(v , v + 1 + N , 0);
    }
    void update(int p , int x){
        for(int i = p ; i <= n ; i += z(i))
            if(dp[x] > dp[v[i]])
                v[i] = x;
    }
    int query(int p){
        int val = 0 , r = 0;
        for(int i = p ; i ; i -= z(i)){
            if(val < dp[v[i]]){
                val = dp[v[i]];
                r = v[i];
            }
        }
        return r;

    }
}t;
int main()
{
    fin >> n;
    for(int i = 1 ; i <= n ; ++ i)
        fin >> v[i] , v2[i] = v[i] , init[i] = v[i];
    sort(v2 + 1 , v2 + 1 + n);
    for(int i = 1 ; i <= n ; ++ i){
        v[i] = (lower_bound(v2 + 1 , v2 + 1 + n , v[i]) - v2);
        int idx = t.query(v[i] - 1);
        dp[i] = 1 + dp[idx];
        fr[i] = idx;
        lg = max(lg , dp[i]);
        t.update(v[i] , i);
    }
    vector<int> ans;
    fout << lg << '\n';
    int p = (max_element(dp + 1 , dp + 1 + n) - dp);
    function<void(int)> out = [&](int x){
        if(x == 0)
            return;
        out(fr[x]);
        fout << init[x] << ' ';
    };
    out(p);
    fout << '\n';
    return 0;
}