Cod sursa(job #2792726)

Utilizator francescom_481francesco martinut francescom_481 Data 2 noiembrie 2021 11:09:47
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define cin fin
#define cout fout

#define N 100005
int n, len, i,k,a[N],b[N],urm[N],ind,x;

int Find(int left, int right, int val)
{
    if(left>right)return -1;

    int mij=(left+right)/2;
    if(a[b[mij]]<val)return Find(mij+1, right, val);

    int answ=Find(left, mij-1, val);
    if(answ!=-1)return answ;

    return mij;
}

void solve()
{
    for(int i=1; i<=n; i++)urm[i]=-1;
    b[0]=-1;
    for(int i=1; i<=n; i++)
    {
        k=Find(1, len, a[i]);
        if(k==-1)
        {
            b[++len]=i;
            urm[i]=b[len-1];
        }
        else
        {
            b[k]=i;
            urm[i]=b[k-1];
        }
    }
    cout<<len<<'\n';
    ind=b[len];
    len=0;
    while(ind!=-1)
    {
        b[++len]=a[ind];
        ind=urm[ind];
    }
    for(int i=len;i;i--)cout<<b[i]<<" ";
}

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    solve();
    return 0;
}