Cod sursa(job #2076918)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 27 noiembrie 2017 13:32:20
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, nr=1, maxim, s[100003], best[100003], prev[100003], l[100003];
void write(int k)
{
    if(prev[k]) write(prev[k]);
    fout<<s[k]<<' ';
}
int bs(int x)
{
    int st, dr, mijl;
    st=0, dr=nr;
    while(st<=dr)
    {
        mijl=(st+dr)/2;
        if(s[l[mijl]]<x && s[l[mijl+1]]>=x)
            return mijl;
        if(s[l[mijl]]<x)
            st=mijl+1;
        else
            dr=mijl-1;
    }
    return nr;
}
int main()
{
    int i, poz;
    fin>>n;
    for(i=1; i<=n; i++)
        fin>>s[i];
    best[1]=1;
    l[1]=1;
    for(i=2; i<=n; i++)
    {
        poz=bs(s[i]);
        prev[i]=l[poz];
        best[i]=poz+1;
        l[poz+1]=i;
        if(nr<poz+1)
            nr=poz+1;
    }
    for(i=1; i<=n; i++)
        if(maxim<best[i])
            maxim=best[i], poz=i;
    fout<<maxim<<'\n';
    write(poz);
    return 0;
}