Cod sursa(job #1647611)

Utilizator DiClauDan Claudiu DiClau Data 10 martie 2016 21:21:34
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<stdio.h>
using namespace std;
const int N = 100005;
FILE *in = fopen ("scmax.in", "r"),
     *out = fopen ("scmax.out", "w");
int v[N], s[N], nr, pre[N];
int cautBin (int x, int n)
{
    int pas = 1, sol = 0;
    while (pas <= n)
        pas <<= 1;
    pas >>= 1;
    while (pas > 0)
    {
        if (sol + pas <= n && v[s[sol + pas]] < x)
            sol += pas;
        pas >>= 1;
    }
    return sol + 1;
}
void afisare (int p)
{
    if (pre[p] == 0)
    {
        fprintf (out, "%d ", v[p]);
        return;
    }
    afisare (pre[p]);
    fprintf (out, "%d ", v[p]);
}
int main ()
{
    int n;
    fscanf (in, "%d", &n);
    int i;
    for (i = 1; i <= n; i++)
        fscanf (in, "%d", &v[i]);
    s[++nr] = 1;
    int p;
    for (i = 2; i <= n; i++)
    {
        if (v[s[nr]] >= v[i])
        {
            p = cautBin (v[i], nr);
            s[p] = i;
            pre[i] = s[p - 1];
        }
        else
        {
            s[++nr] = i;
            pre[i] = s[nr - 1];
        }
    }
    fprintf (out, "%d\n", nr);
    afisare (s[nr]);
    return 0;
}