Cod sursa(job #1362357)

Utilizator radarobertRada Robert Gabriel radarobert Data 26 februarie 2015 12:02:33
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>

using namespace std;

const int MAXN = 100003;

int x[MAXN];
int m[MAXN];
int p[MAXN];
int sol[MAXN];

int main()
{
    FILE *in = fopen("scmax.in", "r");
    FILE *out = fopen("scmax.out", "w");

    int n;
    fscanf(in, "%d", &n);

    for (int i = 1; i <= n; ++i)
        fscanf(in, "%d", &x[i]);

    int l = 1;
    m[1] = 1;
    for (int i = 2; i <= n; ++i)
    {
        int left = 1;
        int right = l;
        while (left <= right)
        {
            int mid = (left+right+1)/2;
            if (x[m[mid]] < x[i])
                left = mid+1;
            else
                right = mid-1;
        }

        p[i] = m[left-1];
        m[left] = i;

        if (left > l)
            l = left;
    }

    int k = m[l];
    int q = 0;
    while (k != 0)
    {
        sol[++q] = x[k];
        k = p[k];
    }

    fprintf(out, "%d\n", l);

    fprintf(out, "%d", sol[q]);
    for (int i = q-1; i > 0; --i)
        fprintf(out, " %d", sol[i]);
    fprintf(out, "\n");

    return 0;
}