Cod sursa(job #2118391)

Utilizator dragostanTantaru Dragos Constantin dragostan Data 30 ianuarie 2018 16:56:04
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <fstream>

using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
const int DIM = 100001;
int v[DIM], pozmin[DIM], pred[DIM];
int n, m;
int cautb(int nr);
void subsir(int nr);
int main()
{
    int j;
    cin >> n;
    for(int i = 1; i <= n; ++i)
    {
        cin >> v[i];
    }

    for(int i = 1; i <= n; ++i)
    {
        j = cautb(v[i]);
        pozmin[j + 1] = i;
        pred[i] = pozmin[j];
        if(j == m)
        {
            ++m;
        }
    }
    cout << m << '\n';
    subsir(pozmin[m]);
    return 0;
}

int cautb(int nr)
{
    int r = 0, pas = 1 << 16;
    while(pas)
    {
        if(r + pas <= m && v[pozmin[r + pas]] < nr)
            r += pas;
        pas /= 2;
    }
    return r;
}

void subsir(int nr)
{
    if(pred[nr])
    {
        subsir(pred[nr]);
    }
    cout << v[nr] << ' ';
}