Cod sursa(job #2776663)

Utilizator betybety bety bety Data 20 septembrie 2021 17:08:30
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int lim=1e5+4;
pair<int,int> bst[lim];
int last[lim];
int v[lim],n;
int main()
{
    in>>n;
    for(int i=1;i<=n;++i)
        in>>v[i];
    int lmax=0;
    for(int i=1;i<=n;++i)
    {
        int l=0,r=lmax,med;
        while(l<r)
        {
            if(r==l+1)
                med=r;
            else med=(l+r)>>1;
            if(v[i]>bst[med].first)
                l=med;
            else r=med-1;
        }
        if(l==lmax)
            ++lmax,bst[lmax]={v[i],i},last[i]=bst[lmax-1].second;
        else if(make_pair(v[i],i)<bst[l+1])
            bst[l+1]={v[i],i},last[i]=bst[l].second;
        else last[i]=bst[l].second;
    }
    out<<lmax<<'\n';
    vector<int> sol;
    int curr=bst[lmax].second;
    for(int i=lmax;i>=1;--i)
    {
        sol.push_back(v[curr]);
        curr=last[curr];
    }
    for(int i=sol.size()-1;i>=0;--i)
        out<<sol[i]<<' ';
    out<<'\n';
    return 0;
}