Cod sursa(job #1889633)

Utilizator vladbatalanBatalan Vlad vladbatalan Data 22 februarie 2017 20:13:44
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, best[100010], p[100010], L[100010], v[100010], poz, nr, maxim, max_poz;
///L memoreaza elementele in ordine crescatoare

void afis(int i)
{
    if(p[i])afis(p[i]);
    fout<<v[i]<<' ';
}

int caut(int x)
{
    int st = 0, dr = nr, mi = (st+dr)/2;
    while(st <= dr)
    {
        if(v[L[mi]] < x && v[L[mi+1]] >= x) return mi;
        else if(v[L[mi+1]] < x){st = mi+1; mi = (st+dr)/2;}
        else {dr = mi-1; mi = (st+dr)/2;}
    }
    return nr;
}

int main()
{
    fin >> n;
    nr = 1;
    for(int i=1; i<=n; i++)
        fin >> v[i];
    best[1] = L[1] = 1;
    for(int i=2; i<=n; i++)
    {
        poz = caut(v[i]);
        p[i] = L[poz];
        best[i] = poz + 1;
        L[poz+1] = i;
        if(poz+1 > nr) nr = poz+1;
    }
    for(int i=1; i<=n; i++)
    {
        if(best[i] > maxim)
        {
            maxim = best[i];
            max_poz = i;
        }
    }
    fout<<maxim<<'\n';
    afis(max_poz);

    return 0;
}