Cod sursa(job #3157630)

Utilizator poparobertpoparobert poparobert Data 16 octombrie 2023 13:03:19
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
typedef long long ll;
vector<ll>scmax(vector<ll>&a)
{
    vector<ll> scm,bck(a.size());
    scm.push_back(0);
    bck[0]=0;
    ll i,st,dr,mid,rez;
    for(i=1;i<a.size();i++)
    {
        //cerr<<i<<endl;
        if(a[i]>a[scm.back()]){bck[i]=scm.size();scm.emplace_back(i);continue;}
        if(a[i]<=a[scm.front()]){bck[i]=0;scm[0]=i;continue;}
        st=0,dr=scm.size()-1;
        while(true)
        {
            //cerr<<st<<' '<<dr<<endl;
            if(st==dr){if(a[scm[st]]<a[i])rez=st;break;}
            mid=(st+dr)/2;
            if(a[scm[mid]]<a[i])rez=mid,st=mid+1;
            else dr=mid;
        }
        bck[i]=rez+1;
        scm[rez+1]=i;
    }
    vector<ll> rezultat(scm.size());
    dr=scm.size()-1;
    for(i=a.size()-1;i>=0;i--)
    {
        if(bck[i]==dr)rezultat[dr]=i,dr--;;
    }
    return rezultat;
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    ll n,i,j;
    cin>>n;
    vector<ll> v(n);
    for(i=0;i<n;i++)cin>>v[i];
    vector<ll> rez=scmax(v);
    cout<<rez.size()<<'\n';
    for(i=0;i<rez.size();i++)cout<<v[rez[i]]<<' ';
	return 0;
}