#include using namespace std; using lint = long long int; using pint = pair; using plint = pair; struct fast_ios { fast_ios(){ cin.tie(0); ios::sync_with_stdio(false); cout << fixed << setprecision(20); }; } fast_ios_; #define ALL(x) (x).begin(), (x).end() #define FOR(i, begin, end) for(int i=(begin),i##_end_=(end);i=i##_begin_;i--) #define REP(i, n) FOR(i,0,n) #define IREP(i, n) IFOR(i,0,n) template void ndarray(vector &vec, int len) { vec.resize(len); } template void ndarray(vector &vec, int len, Args... args) { vec.resize(len); for (auto &v : vec) ndarray(v, args...); } template bool chmax(T &m, const T q) { if (m < q) {m = q; return true;} else return false; } template bool chmin(T &m, const T q) { if (m > q) {m = q; return true;} else return false; } template pair operator+(const pair &l, const pair &r) { return make_pair(l.first + r.first, l.second + r.second); } template pair operator-(const pair &l, const pair &r) { return make_pair(l.first - r.first, l.second - r.second); } template istream &operator>>(istream &is, vector &vec){ for (auto &v : vec) is >> v; return is; } template ostream &operator<<(ostream &os, const vector &vec){ os << "["; for (auto v : vec) os << v << ","; os << "]"; return os; } template ostream &operator<<(ostream &os, const deque &vec){ os << "deq["; for (auto v : vec) os << v << ","; os << "]"; return os; } template ostream &operator<<(ostream &os, const set &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; } template ostream &operator<<(ostream &os, const unordered_set &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; } template ostream &operator<<(ostream &os, const multiset &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; } template ostream &operator<<(ostream &os, const unordered_multiset &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; } template ostream &operator<<(ostream &os, const pair &pa){ os << "(" << pa.first << "," << pa.second << ")"; return os; } template ostream &operator<<(ostream &os, const map &mp){ os << "{"; for (auto v : mp) os << v.first << "=>" << v.second << ","; os << "}"; return os; } template ostream &operator<<(ostream &os, const unordered_map &mp){ os << "{"; for (auto v : mp) os << v.first << "=>" << v.second << ","; os << "}"; return os; } #define dbg(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ") " << __FILE__ << endl; /* #include #include #include using namespace __gnu_pbds; // find_by_order(), order_of_key() template using pbds_set = tree, rb_tree_tag, tree_order_statistics_node_update>; template using pbds_map = tree, rb_tree_tag, tree_order_statistics_node_update>; */ struct custom_hash { // static uint64_t splitmix64(uint64_t x) { // http://xorshift.di.unimi.it/splitmix64.c x += 0x9e3779b97f4a7c15; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9; x = (x ^ (x >> 27)) * 0x94d049bb133111eb; return x ^ (x >> 31); } size_t operator()(uint64_t x) const { static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); return splitmix64(x + FIXED_RANDOM); } }; map> a2pos; unordered_map, custom_hash> a2add; vector coeff; int main() { int N, K; cin >> N >> K; vector A(N); cin >> A; REP(i, N) a2pos[A[i]].emplace_back(i); set s; s.insert(-1); s.insert(N); lint ret = 0; for (auto &p : a2pos) { vector v = p.second; s.insert(v.begin(), v.end()); for (auto x : v) { int l = *prev(s.lower_bound(x)) + 1, r = *s.upper_bound(x) - 1; if (x - l <= r - x) { FOR(i, l, x + 1) if (a2pos.count(K - A[i])) { int ll = x, rr = r; int n = (upper_bound(ALL(a2pos[K - A[i]]), rr) - lower_bound(ALL(a2pos[K - A[i]]), ll)); if (n) { ret -= 1LL * i * n; a2add[K - A[i]].emplace_back(ll, 1); a2add[K - A[i]].emplace_back(rr + 1, -1); } } } else { FOR(i, x, r + 1) if (a2pos.count(K - A[i])) { int ll = l, rr = x; int n = (upper_bound(ALL(a2pos[K - A[i]]), rr) - lower_bound(ALL(a2pos[K - A[i]]), ll)); if (n) { ret += 1LL * (i + 2) * n; a2add[K - A[i]].emplace_back(ll, -1); a2add[K - A[i]].emplace_back(rr + 1, 1); } } } } } constexpr int INF = 1e9; for (auto p : a2add) { vector v = p.second; for (auto x : a2pos[p.first]) v.emplace_back(x, INF); sort(ALL(v)); lint n = 0; for (auto p : v) { if (p.second == INF) ret += 1LL * (p.first + 1) * n; else n += p.second; } } cout << ret << '\n'; }