Cod sursa(job #2805612)

Utilizator OffuruAndrei Rozmarin Offuru Data 21 noiembrie 2021 15:15:15
Problema Subsir crescator maximal Scor 85
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>
#define nmax 100005

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int a[nmax],d[nmax],p[nmax],path[nmax],n,k,power=1;

void read()
{
    fin>>n;
    for(int i=1;i<=n;i++)
        fin>>a[i];
    while(power<n)
        power<<=1;
}

int upperBound(int x)
{
    int left=1,right=k,pos=k+1;

    while(left<=right)
    {
        int mid=left+(right-left)/2;
        if(d[mid]>x)
            pos=mid,right=mid-1;
        else
            left=mid+1;
    }
    return pos;
}

void solve()
{
    k=1;
    d[1]=a[1];

    for(int i=2;i<=n;i++)
        if(a[i]>d[k])
            d[++k]=a[i],p[i]=k;
        else
        {
            int pos=upperBound(a[i]);
            d[pos]=a[i];
            p[i]=pos;
        }
    fout<<k<<"\n";

    int j=n;

    for(int i=k;i>=1;i--)
    {
        while(p[j]!=i)
            j--;
        path[i]=j;
    }
    for(int i=1;i<=k;i++)
        fout<<a[path[i]]<<" ";
}

int main()
{
    read();
    solve();
    return 0;
}