Cod sursa(job #1994821)

Utilizator Claudiu07Pana Claudiu Claudiu07 Data 26 iunie 2017 09:14:58
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,a[100010],b[100010],c[100010],d[100010],crt,poz,maxi,l;
int bsearch2 (int p, int u, int key)
{
    int m;

    while (p < u)
    {
        m = (p + u) / 2;
        if(c[m]>key && c[m-1]<key) return m;
        else if (c[m] < key)
            p = m + 1;
        else
            u = m;
    }

    m = (p + u) / 2;
    if (c[m] < key)
        ++ m;
    return m;
}
int main()
{
    f>>n;
    l=0;
    for(int i=1; i<=n; i++)
    {
        f>>a[i];
    }
    for(int i=1; i<=n; i++)
    {
        if(a[i]>c[l]) {l++; c[l]=a[i]; b[i]=++maxi;}
        else
        {
            c[bsearch2(1,l,a[i])]=a[i];
            b[i]=bsearch2(1,l,a[i]);
        }
    }
    maxi=0;
    for(int i=1; i<=n; i++)
        if(maxi<b[i]) {maxi=b[i]; poz=i;}
    g<<maxi<<'\n';
    d[1]=a[poz]; int k=1;
    for(int i=poz; i>0; i--)
    {
        if(a[poz]>a[i] && b[poz]==b[i]+1) {k++; d[k]=a[i]; poz=i;}
    }
    for(int i=k; i>0; i--)
        g<<d[i]<<' ';
    g<<'\n';
    return 0;
}