Cod sursa(job #2460342)

Utilizator maramihaliMara Mihali maramihali Data 23 septembrie 2019 14:29:09
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>

using namespace std;

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

const int MAX=100003;
const int l = 20;

int n,a[MAX],pre[MAX],pozmin[MAX],best[MAX];

int cautb(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 (pre[poz] == -1)
    {
        out << a[poz] << " ";
        return ;
    }
    afis(pre[poz]);
    out << a[poz] << " ";
}

int main()
{
    in >> n;
    for (int i=1; i<=n; i++)
    {
        in >> a[i];
        pozmin[i] = n+1;
        pre[i] = -1;
    }
    a[n+1] = 20000000;
    int m = 0,j,ind;
    pre[1] = -1;
    pozmin[1] = 1;
    pozmin[0] = -1;
    for (int i=2; i<=n; i++)
    {
        j = cautb(a[i]);
        if (j==m)
        {
            ++m;
            ind = i;
        }
        pre[i] = pozmin[j];
        pozmin[j + 1] = i;
    }
    out << m << "\n";
    afis(ind);
    return 0;
}