Cod sursa(job #2375380)

Utilizator AlexTudorAlex Brinza AlexTudor Data 8 martie 2019 08:42:53
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>
using namespace std;

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

const int NMAX=100005;

const int INF=(1<<30);

int N,x,last;

int a[NMAX],aux[NMAX],prec[NMAX];

int cautare(int st , int dr , int val)
{
    if(st>dr) return 0;

    int m=(st+dr)/2;

    if(a[aux[m]]<val) return max(m,cautare(m+1,dr,val));
    else
        return cautare(st,m-1,val);

}

void read()
{
    fin>>N;

    for(int i=1;i<=N;++i)
    {
        fin>>a[i];
    }
}

void afis(int poz)
{
    if(prec[poz]!=0) afis(prec[poz]);
    fout<<a[poz]<<" ";
}

void solve()
{
    a[0]=-INF;
    a[N+1]=INF;

    aux[0]=0;
    last=0;

    int x;

    for(int i=1;i<=N;++i)
    {
        if(a[i]>a[aux[last]])
        {
            aux[++last]=i;
            prec[i]=aux[last-1];
        }
        else
        {
            x=cautare(1,last,a[i]);

            aux[x+1]=i;
            prec[i]=aux[x];
        }
    }

    fout<<last<<"\n";

    afis(aux[last]);
}

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