{"id":"4pCPFuegpK","url":"https://pastebin.ca/4pCPFuegpK","raw_url":"https://raw.anybin.ca/4pCPFuegpK","visibility":"public","access":"public","created_at":1794134942714,"expires_at":1794739742714,"fetch_limit":null,"fetches_used":0,"reads_remaining":null,"size_bytes":2866,"syntax_hint":"cpp","title":null,"filename":null,"change_note":null,"cipher":null,"cipher_meta":null,"parent_id":null,"root_id":"4pCPFuegpK","version":1,"owner_id":null,"recipient_id":null,"body":"#include <bits/stdc++.h>\n\nusing i64 = long long;\n\nvoid Solve() {\n    int n;\n    i64 d;\n    std::cin >> n >> d;\n\n    std::vector<i64> x(n);\n    for (int i = 0; i < n; i++) {\n        std::cin >> x[i];\n    }\n\n    std::vector<int> right(n, -1);\n\n    for (int i = n - 1, j = n - 1; i >= 0; i--) {\n        while (j > i && x[j] - x[i] > d) {\n            j--;\n        }\n        right[i] = j;\n    }\n\n    std::vector<int> g(n, n);\n    std::vector<int> left(n, n);\n\n    for (int i = 0, j = 0; i < n; i++) {\n        while (j < i && x[i] - x[j] > d) {\n            j++;\n        }\n        \n        g[j] = std::min(g[j], i);\n        left[i] = j;\n    }\n\n    constexpr int A = 3, B = 3, V = 2;\n    constexpr int STRIDE_A = B * V;        // 6\n    constexpr int STRIDE_B = V;            // 2\n    constexpr int STRIDE_I = A * B * V;    // 18\n\n    std::vector<int> f(n * STRIDE_I);\n    auto F = [&](int i, int a, int b, int v) -> int& {\n        return f[i * STRIDE_I + (a - 1) * STRIDE_A + (b - 1) * STRIDE_B + (v - 1)];\n    };\n\n    for (int i = n - 1; i >= 1; i--) {\n        if (right[i] == i) {\n            continue;\n        }\n\n        int j = right[i];\n\n        if (j == i) {\n            continue;\n        }\n\n        for (int a = 1; a <= 3; a++) {\n            for (int b = 1; b <= 3; b++) {\n                if (j == i + 1) {\n                    int c = std::min(3, left[j] == i ? b : left[j] == i - 1 ? a + b : 3);\n                    F(i, a, b, 1) += F(j, 1, c, 1); \n                    F(i, a, b, 2) += F(j, 1, c, 2); \n\n                    if (c <= 2) {\n                        F(i, a, b, c) += 1;\n                    }\n\n                    continue;\n                }\n\n                int p1 = std::max(i + 1, g[i - 1]), p2 = std::min(j + 1, g[i]);\n                    \n                if (b <= 2) {\n                    F(i, a, b, b) += j - p2 + 1;\n                }\n                \n                if (a + b <= 2) {\n                    F(i, a, b, a + b) += std::max(0, p2 - p1);\n                }\n\n                int c = std::min(3, left[j - 1] < i - 1 ? 3 : left[j - 1] == i - 1 ? a + b : b);\n                int d = std::min(3, left[j] < i - 1 ? 3 : left[j] == i - 1 ? a + b : b);\n\n                F(i, a, b, 1) += F(j, c, d, 1);\n                F(i, a, b, 2) += F(j, c, d, 2);\n            }\n        }\n    }\n\n    i64 ans = 0, lst = 0;\n    for (int i = n - 1; i >= 0; i--) {\n        if (right[i] == i) {\n            lst = 0;\n            continue;\n        }\n\n        if (right[i] == i + 1) {\n            ans += lst;\n            continue;\n        }\n\n        lst = F(right[i], 1, 1, 2);\n        ans += lst;\n\n       // std::cout << lst << \" \";\n    }\n   // std::cout << \"\\n\";\n\n    std::cout << ans << '\\n';\n }  \n\nint main() {\n    std::ios::sync_with_stdio(false);\n    std::cin.tie(0);\n\n    int c, t;\n    std::cin >> c >> t;\n\n    while (t --) {\n        Solve();\n    }\n\n    return 0;\n}"}