Cod sursa(job #2460550)

Utilizator Rares31100Popa Rares Rares31100 Data 23 septembrie 2019 21:42:17
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>
#define val first
#define poz second

using namespace std;

int a[100001],n;
int bac[100001];
pair <int,int> lung[100001];
int lgmx;
int sol[100001],nrsol;

int find_bin(int st,int dr,int val)
{
    while(st<=dr)
    {
        int m=(st+dr)/2;
        if(lung[m].val>val)
            dr=m-1;
        else
            st=m+1;
    }

    if(lgmx<st && lung[lgmx].val!=val)
        lgmx++;

    return st;
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        int poz=find_bin(1,lgmx,a[i]);

        if(!lung[poz].val || a[i]!=lung[poz-1].val)
        {
            bac[i]=lung[poz-1].poz;
            lung[poz].val=a[i];
            lung[poz].poz=i;
        }

    }

    int k=lung[lgmx].poz,nrsol=0;
    while(k)
    {
        sol[++nrsol]=a[k];
        k=bac[k];
    }

    cout<<lgmx<<'\n';
    while(nrsol)
        cout<<sol[nrsol--]<<' ';
}