Cod sursa(job #3138833)

Utilizator NutaAlexandruASN49K NutaAlexandru Data 22 iunie 2023 19:42:40
Problema Subsir crescator maximal Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cassert>
#include <cmath>
#include <stack>
#include <set>
#include <functional>
#include <bitset>
#include <map>
using namespace std;
template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }
template<typename A> ostream& operator<<(ostream &os, vector<A>&a) { for(auto &c:a)os<<c<<' '; return os;}
template<typename A> istream& operator>>(istream &os, vector<A>&a) { for(auto &c:a)os>>c; return os;}
template<typename A,size_t N> istream& operator>>(istream &os, array<A,N>&a) { for(auto &c:a)os>>c; return os;}
#define bug(a) cerr << "(" << #a << ": " << a << ")\n";
#define all(x) x.begin(),x.end()
#define pb push_back
using i64= int64_t;
using i16= int16_t;
using u64= uint64_t;
using u32= uint32_t;
using i32= int32_t;
const i32 inf=1e9;
const i64 INF=1e18;
const int mod=1e9+7;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
void solve()
{
    int n;
    cin>>n;
    vector<int>a(n,inf);
    int rez=0;
    vector<int>urm(n,-1),e(n);
    int poz=-1;
    vector<int>v(n);
    for(int i=0,x;i<n;i++)
    {
        cin>>x;
        auto it=upper_bound(all(a),x);
        *it=x;
        int aux=it-a.begin()+1;
        e[aux-1]=i;
        if(aux>1)
        {
            urm[i]=e[aux-2];
        }
        if(aux>rez)
        {
            rez=aux;
            poz=i;
        }
        v[i]=x;
    }
    cout<<rez<<'\n';
    stack<int>st;
    for(int i=1;i<=rez;i++,poz=urm[poz])
    {
        st.push(v[poz]);
    }
    while(st.size())
    {
        cout<<st.top()<<' ';
        st.pop();
    }
}
main()
{
    int tt=1;
    ios::sync_with_stdio(false);
    cin.tie(0);
    //cin>>tt;
    while(tt--)
    {
        solve();
    }
}