#include #include typedef struct { int num; int pos; int count; } number; int comp1(const void *a, const void *b) { number *an = (number*)a; number *bn = (number*)b; if ((*an).num < (*bn).num) return -1; if ((*an).num == (*bn).num) return 0; return 1; } int comp2(const void *a, const void *b) { number *an = (number*)a; number *bn = (number*)b; if ((*an).num > (*bn).num) return -1; if ((*an).num == (*bn).num) return 0; return 1; } int main() { int d, m, i, j, minc, maxc, maxmax; int p[70000]; number min[70000]; number max[70000]; long pr, pr0; while (1) { scanf("%d", &d); if (!d) break; scanf("%d", &m); for (i = 0; i < d; i++) scanf("%d", &p[i]); minc = 0; maxc = 0; for (i = 0; i < d; i++) if (((i > 0 && p[i-1] < p[i]) || (i == 0)) && ((p[i+1] < p[i] && i < d - 1) || (i == d - 1))) { max[maxc].num = p[i]; max[maxc++].pos = i; } else if (((i > 0 && p[i-1] > p[i]) || (i == 0)) && ((p[i+1] > p[i] && i < d - 1) || (i == d - 1))) { min[minc].num = p[i]; min[minc].count = m / p[i]; min[minc++].pos = i; } /* for (i = 0; i < minc; i++) printf("%d ", min[i][0]); printf("\n"); for (i = 0; i < maxc; i++) printf("%d ", max[i][0]); printf("\n"); */ pr = 0; if (d > 1) { qsort(min, minc, sizeof(number), comp1); qsort(max, maxc, sizeof(number), comp2); maxmax = max[0].num; pr = 0; for (i = 0; i < minc; i++) { if (min[i].num >= maxmax) break; for (j = 0; j < maxc; j++) { if (max[j].pos > min[i].pos) { pr0 = (min[i].count * max[j].num) - (min[i].count) * min[i].num; if (pr0 > pr) pr = pr0; break; } } } } printf("%ld\n", pr); } return 0; }