Cod sursa(job #3349995)

Utilizator eric_dragosDragos Eric eric_dragos Data 4 aprilie 2026 14:01:41
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n;
vector<int> a;

int cautbin(vector<stack<pair<int,int>>> &s, int x){
    int l=0, r = s.size()-1, ans=-1;
    while(l <= r){
        int mid = l+(r-l)/2;
        if(s[mid].top().first >= x){
            ans = mid;
            r = mid-1;
        }
        else{
            l = mid+1;
        }
    }

    return ans;
}

vector<int> lis(vector<int> &v){
    int n = v.size();
    vector<stack<pair<int,int>>> s;
    vector<int> pred(n, -1);
    for(int i = 0; i<n; i++){
        if(s.empty()){
            s.push_back(stack<pair<int,int>>());
            s.back().push({v[i], i});
            continue;
        }
        int poz = cautbin(s, v[i]);
        if(poz == -1){
            pred[i] = s.back().top().second;
            s.push_back(stack<pair<int,int>>());
            s.back().push({v[i], i});
        }
        else {
            if(poz > 0)
                pred[i] = s[poz-1].top().second;
            s[poz].push({v[i],i});
        }
    }
    int cur = s.back().top().second;
    vector<int> res;
    while(cur != -1){
        res.push_back(v[cur]);
        cur = pred[cur];
    }
    reverse(res.begin(), res.end());
    return res;
}
int main(){
    fin >> n;
    a.resize(n);
    vector<int> ans;
    for(int i = 0; i<n; i++){
        fin >> a[i];
    }
    ans = lis(a);
    fout << ans.size() << '\n';
    for(int i : ans) fout << i << ' ';

    return 0;
}