Pagini recente » Cod sursa (job #3150712) | Cod sursa (job #2903877) | Cod sursa (job #915564) | Cod sursa (job #1090302) | Cod sursa (job #1462832)
#include <stdio.h>
#include <string.h>
#define nmax 100005
#define size 1500000
int n, a[nmax], P[nmax], prev[nmax], p[nmax], i, j, len, max, imax, maxp, maxprev;
char string[size];
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++;
}
for (i = 1; i <= n; i++)
{
P[i] = 1;
prev[i] = -1;
}
imax = 1;
max = p[1];
for (j = 2; j <= n; j++)
{
int m = 0;
//for (i = 1; i < j; i++)
//{
if (a[i] < a[j])
{
if (m < 1 + max)
{
m = 1 + max;
prev[j] = imax;
}
}
//}
P[j] = (m > P[j] ? m : P[j]);
if (m > max)
{
max = m;
imax = j;
}
}
i = 1;
while (imax > 0)
{
p[i++] = a[imax];
imax = prev[imax];
}
for (i = max; i >= 1; i--)
{
if (p[i] <= maxprev)
maxp++;
maxprev = p[i];
}
maxprev = 0;
printf("%d\n", max - maxp);
for (i = max; i >= 1; i--)
{
if (p[i] > maxprev)
printf("%d ", p[i]);
maxprev = p[i];
}
fclose(in);
fclose(out);
return 0;
}