#include int ri() { int n; scanf("%d", &n); return n; } std::vector a; int k; int64_t res = 0; // use from a void merge(const std::vector &a, const std::vector &b) { int n = a.size(); int m = b.size(); int min = 1000000001; int cnt = 0; struct Info { int min; int cnt; int64_t sum; bool operator < (const Info &rhs) const { return min < rhs.min; } }; std::map > single; for (int i = 0; i < n; i++) { if (min > a[i]) min = a[i], cnt = 1; else if (min == a[i]) cnt++; if (cnt > 1) continue; single[a[i]].push_back({min, 1, i}); } for (auto &i : single) { std::sort(i.second.begin(), i.second.end()); std::vector tmp; for (auto j : i.second) { if (!tmp.size() || tmp.back().min != j.min) tmp.push_back(j); else tmp.back().cnt += j.cnt, tmp.back().sum += j.sum; } for (int j = 0; j + 1 < (int) tmp.size(); j++) { tmp[j + 1].cnt += tmp[j].cnt; tmp[j + 1].sum += tmp[j].sum; } i.second = tmp; } min = 1000000001; for (int i = 0; i < m; i++) { min = std::min(min, b[i]); auto &r0 = single[k - b[i]]; auto itr = std::lower_bound(r0.begin(), r0.end(), Info{min, 0, 0}); if (itr != r0.begin()) { itr--; res += itr->sum; res += (int64_t) itr->cnt * (i + 2); } } } void solve(int l, int r) { if (r - l == 1) { if (a[l] * 2 == k) res += 1; return; } int m = l + ((r - l) >> 1); std::vector r0(a.begin() + l, a.begin() + m); std::reverse(r0.begin(), r0.end()); std::vector r1(a.begin() + m, a.begin() + r); merge(r0, r1); merge(r1, r0); solve(l, m); solve(m, r); } int main() { int n = ri(); k = ri(); a.resize(n); for (auto &i : a) i = ri(); solve(0, n); printf("%" PRId64 "\n", res); return 0; }