Cod sursa(job #2578516)

Utilizator Rares31100Popa Rares Rares31100 Data 11 martie 2020 10:55:45
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <bits/stdc++.h>
#define val first
#define poz second

using namespace std;

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

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()
{
    in>>n;
    for(int i=1;i<=n;i++)
    {
        in>>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];
    }

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