intqpow(int bs, int64_t idx = kMod - 2){ int ret = 1; for (; idx; idx >>= 1, bs = (int64_t)bs * bs % kMod) if (idx & 1) ret = (int64_t)ret * bs % kMod; return ret; }
inlineintadd(int x, int y){ return (x + y >= kMod ? x + y - kMod : x + y); } inlineintsub(int x, int y){ return (x >= y ? x - y : x - y + kMod); } inlinevoidinc(int &x, int y){ (x += y) >= kMod ? x -= kMod : x; } inlinevoiddec(int &x, int y){ (x -= y) < 0 ? x += kMod : x; }
namespace Part1 { int f[kMaxN][2][2];
intsolve(){ int ans = 1; for (int i = 1, mx = 0; i <= n; ++i) { memset(f[i], 0, sizeof(f[i])); if (a[i] > mx) { f[i][a[i] != 1][a[i] == 2] = 1; } for (int j = i - 1, mx = 0; j; --j) { if (a[i] > mx) { for (int o1 = 0; o1 < 2; ++o1) { for (int o2 = 0; o2 < 2; ++o2) { if (!(!o1 && a[i] > 1)) inc(f[i][o1 & (a[i] > 1)][o2], f[j][o1][o2]); } } } mx = std::max(mx, a[j]); } mx = std::max(mx, a[i]); inc(ans, add(add(f[i][0][0], f[i][0][1]), add(f[i][1][0], f[i][1][1]))); } if (m > 2 && a[n] == 1) dec(ans, add(f[n][0][1], f[n][1][1])); return ans; } } // namespace Part1
namespace Part2 { int pre[kMaxN], fir[kMaxN];
voidprework(){ staticint stk[kMaxN]; int top = 0; for (int i = 1; i <= n; ++i) { for (; top && a[i] > a[stk[top]]; --top) {} pre[i] = stk[top], stk[++top] = i; } }
intsolve(){ int len = n; n = 0; for (int i = 1; i <= len; ++i) { if (a[i] > 1) a[++n] = a[i]; } if (!n) return0; prework(); for (int i = 1; i <= n; ++i) { fir[i] = 0; for (int j = n; j; --j) { if (a[i] <= a[j] + 1) { fir[i] = j; break; } } } int ans = 0; for (int i = 1; i <= n; ++i) { staticint f[kMaxN], cntf[kMaxN], g[kMaxN], cntg[kMaxN]; staticint df[kMaxN], dcntf[kMaxN], dg[kMaxN], dcntg[kMaxN]; int val = a[i] - 2; for (int i = 0; i <= n; ++i) { f[i] = cntf[i] = g[i] = cntg[i] = 0; df[i] = dcntf[i] = dg[i] = dcntg[i] = 0; } f[i] = val, g[i] = 0, cntf[i] = cntg[i] = 1; int ff = 0, cntff = 0; for (int j = i; j; --j) { inc(ff, df[j]), inc(cntff, dcntf[j]); if (a[j] > a[i]) { f[j] = ff, cntf[j] = cntff; } inc(ff, add(f[j], 1ll * (val + 1) * cntf[j] % kMod)); inc(cntff, cntf[j]); if (pre[j]) { dec(df[pre[j] - 1], add(f[j], 1ll * (val + 1) * cntf[j] % kMod)); dec(dcntf[pre[j] - 1], cntf[j]); } } for (int j = i; j <= n; ++j) { if (j != i && a[j] >= a[i]) { g[j] = sub(dg[j - 1], dg[std::max(pre[j] - 1, 0)]); cntg[j] = sub(dcntg[j - 1], dcntg[std::max(pre[j] - 1, 0)]); } dg[j] = add(dg[j - 1], add(g[j], 1ll * val * cntg[j] % kMod)); dcntg[j] = add(dcntg[j - 1], cntg[j]); } staticint sg[kMaxN], scntg[kMaxN]; for (int j = 1; j <= n; ++j) { sg[j] = add(sg[j - 1], g[j]); scntg[j] = add(scntg[j - 1], cntg[j]); } for (int j = 1, mx = 0; j <= i; ++j) { if (a[j] > mx) { inc(ans, 1ll * f[j] * sub(scntg[n], scntg[std::max(i, fir[j]) - 1]) % kMod); inc(ans, 1ll * cntf[j] * sub(sg[n], sg[std::max(i, fir[j]) - 1]) % kMod); } mx = std::max(mx, a[j]); } } --ans; for (int i = 1; i <= n; ++i) if (a[i] == m) ++ans; for (int i = n; i; --i) { if (a[i] == m - 1) ++ans; elseif (a[i] == m) break; } return ans; } } // namespace Part2
voiddickdreamer(){ std::cin >> n >> m; for (int i = 1; i <= n; ++i) std::cin >> a[i]; m = *std::max_element(a + 1, a + 1 + n); if (m == 1) returnvoid(std::cout << n << '\n'); std::cout << (Part1::solve() + Part2::solve()) % kMod << '\n'; }