Cod sursa(job #2962048)

Utilizator Chris_BlackBlaga Cristian Chris_Black Data 7 ianuarie 2023 18:01:01
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#include <stack>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
const int N = 100009;
long long n,v[N],c[N],len,L[N],poz,p[N];
stack<long long> stk;
int cb(int x) /// upperbound
{
    if(x > c[len])return len + 1;
    if(len==0)return 1;

    int st = 1,dr = len,mij,pz = -1;
    while(st<=dr)
    {
        mij = (st+dr)/2;
        if(x < c[mij])
        {
            pz = mij;
            dr = mij-1;
        }
        else
            st = mij+1;
    }
    return pz;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;++i)
        cin>>v[i];
    for(int i=1;i<=n;++i)
    {
        poz = cb(v[i]);
        if(poz > len)
            ++len;
        c[poz] = v[i];
        p[i] = poz;
    }
    cout<<len<<'\n';
    for(int i=n;i>=1;--i)
        if(p[i] == len)
        {
            stk.push(v[i]);
            --len;
        }
    while(!stk.empty())
    {
        cout<<stk.top()<<' ';
        stk.pop();
    }
    return 0;
}