Cod sursa(job #3343927)

Utilizator IleaIlea Bogdan Ilea Data 28 februarie 2026 18:51:29
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include<iostream>
#include<set>
#include<stack>
using namespace std;

#define NMAX 100001

int n,v[NMAX],pv[NMAX];
struct spair{
    int idx,cnt;
    friend bool operator<(const spair&s1,const spair&s2){
        if(v[s1.idx]!=v[s2.idx])return v[s1.idx]<v[s2.idx];
        if(s1.cnt!=s2.cnt)return s1.cnt<s2.cnt;
        return s1.idx<s2.idx;
    }
    friend bool operator==(const spair&s1,const spair&s2){
        return s1.idx==s2.idx&&s1.cnt==s2.cnt;
    }
};
set<spair>dp;
signed main(){
#ifndef LOCAL
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
#endif // LOCAL
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    cin>>n;
    for(int i=1;i<=n;++i){
        cin>>v[i];
        pv[i]=-1;
    }
    dp.insert({1,1});
    int maxim=1,mi=1;
    for(int i=2;i<=n;++i){
        auto it=*dp.upper_bound({i,0x7fffffff});
        if(it==*dp.begin()){
            dp.insert({i,1});
            continue;
        }
        auto nit=dp.find(it);
        --nit;
        if(v[i]==v[nit->idx]){
            pv[i]=pv[nit->idx];
            continue;
        }
        pv[i]=nit->idx;
        if(nit->cnt+1>maxim){
            maxim=nit->cnt+1;
            mi=i;
        }
        dp.insert({i,nit->cnt+1});
    }
    cout<<maxim<<"\n";
    stack<int>rsol;
    while(pv[mi]>=0){
        rsol.push(mi);
        mi=pv[mi];
    }
    cout<<v[mi]<<" ";
    for(;!rsol.empty();rsol.pop())cout<<v[rsol.top()]<<" ";
    return 0;
}