Cod sursa(job #1462826)

Utilizator om6gaLungu Adrian om6ga Data 19 iulie 2015 04:52:21
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <stdio.h>
#include <string.h>

#define nmax 100005
#define size 1500000

int n, a[nmax], P[nmax], prev[nmax], i, j, len, max, imax;
char string[size];

void print(int imax)
{
     if (imax > 0)
     {
         print(prev[imax]);
         printf("%d ", a[imax]);
     }
}

int main()
{
    FILE *in, *out;
    in =  freopen("scmax.in", "r", stdin);
    out = freopen("scmax.out", "w", stdout);
    
    fscanf(in, "%d\n", &n);
    
    fgets(string, size, in);
    
    i = 1;
    len = strlen(string);
    for (j = 0; j < len; j++)
    {
        if (string[j] == ' ')
            continue;
        while (string[j] >= '0' && string[j] <= '9')
            a[i] = a[i]*10 + string[j++] - '0';
        i++;
    }
    
    P[1] = 1;
    prev[1] = -1;
    for (j = 2; j <= n; j++)
    {
        int m = 0;
        for (i = 1; i < j; i++)
        {
            if (a[i] < a[j])
            {
                if (m < 1 + P[i])
                {
                    m = 1 + P[i];
                    prev[j] = i;
                }
            }
            else
            {
                if (m < P[i])
                {
                    m = P[i];
                    prev[j] = -1;
                }
            }    
        }
        P[j] = m;
        if (m > max)
        {
            max = m;
            imax = j;      
        }
    }
    
    printf("%d\n", max);
    print(imax);
    
    fclose(in);
    fclose(out);
    return 0;   
}