Cod sursa(job #2458782)

Utilizator StanCatalinStanCatalin StanCatalin Data 21 septembrie 2019 14:43:59
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int dim = 100005;
const int l = 20;

int n,a[dim],pred[dim],pozmin[dim],best[dim];

int cautbin(int val)
{
    int pas = 1<<l;
    int r = 0;
    while (pas != 0)
    {

        if (r+pas <= n && pozmin[r+pas] <= n && a[pozmin[r+pas]] < val)
        {
            r += pas;
        }
        pas /= 2;
    }
    return r;
}

void afis(int poz)
{
    if (pred[poz] == -1)
    {
        out << a[poz] << " ";
        return ;
    }
    afis(pred[poz]);
    out << a[poz] << " ";
}

int main()
{
    in >> n;
    for (int i=1; i<=n; i++)
    {
        in >> a[i];
        pozmin[i] = n+1;
        pred[i] = -1;
    }
    a[n+1] = 20000000;
    int m = 0,j,start;
    pred[1] = -1;
    pozmin[1] = 1;
    pozmin[0] = -1;
    for (int i=2; i<=n; i++)
    {
        j = cautbin(a[i]); /// cel mai mare j cu prop ca a[pozmin[j]] < a[i]
        if (m < j+1)
        {
            m = j+1;
            start = i;
        }
        pred[i] = pozmin[j];
        pozmin[j + 1] = i;
    }
    out << m << "\n";
    afis(start);
    return 0;
}