#include #include #include using namespace std; #define ll long long #define LIM 1000011 #define BD 60 int mx[LIM]; int mn[LIM]; vector< vector > qmx0(LIM>>1); vector< vector > qmn0(LIM>>1); vector< vector > qsm0(LIM>>1); vector< vector > qmx1(LIM>>1); vector< vector > qmn1(LIM>>1); vector< vector > qsm1(LIM>>1); int *mmx = (int*)malloc((LIM*2)*sizeof(int)); int *mmn = (int*)malloc((LIM*2)*sizeof(int)) + LIM; int *msm = (int*)malloc((LIM*2)*sizeof(int)); ll solve(int *a, int n, int w) { if (n < w) return 0; if (n < BD) { // small n.. brute-force ll ans = 0; for (int i = 0; i < n; i++) { int mx = a[i], mn = a[i]; for (int j = i; j < n; j++) { if (mx < a[j]) mx = a[j]; if (mn > a[j]) mn = a[j]; if (j - i + 1 >= w && mx - mn == j - i) ans++; } } return ans; } int k = n >> 1; // divide into halves, and solve both halves ll ans = solve(a, k, w) + solve(a + k, n - k, w); // compute mx and mn mx[k-1] = mn[k-1] = a[k-1]; mx[k ] = mn[k ] = a[k ]; for (int i = k-2; i >= 0; i--) { mx[i] = max(a[i], mx[i+1]); mn[i] = min(a[i], mn[i+1]); } for (int i = k+1; i < n; i++) { mx[i] = max(a[i], mx[i-1]); mn[i] = min(a[i], mn[i-1]); } // compute queries int HI1 = 0, HI2 = 0; int bd = max(k,w-2); for (int j = n-1; j >= bd; j--) { int mxj = mx[j], mnj = mn[j]; while (HI1 < k && (mx[HI1] > mxj && mn[HI1] < mnj)) HI1++; while (HI2 < k && (mx[HI2] > mxj || mn[HI2] < mnj)) HI2++; int L = j - w + 2; int I1 = min(L, HI1); int I2 = min(L, HI2); int v = j - mxj + mnj; if (I2 <= v && v < min(k, L)) ans++; #define add(targ, S, I, t) do {\ if (I) {\ m##targ[t] = 0;\ q##targ##S[I-1].push_back(t);\ }\ } while (0) add(sm, 1, I1, j); if (I1 < I2) { if (mx[I1] > mxj) { int t = j + mnj; add(mx, 1, I2, t); add(mx, 0, I1, t); } else { int t = j - mxj; add(mn, 1, I2, t); add(mn, 0, I1, t); } } } for (int i = 0; i < k; i++) { mmx[i+mx[i]] = 0; mmn[i-mn[i]] = 0; msm[i+mx[i]-mn[i]] = 0; } // answer queries for (int i = 0; i < k; i++) { mmx[i+mx[i]]++; mmn[i-mn[i]]++; msm[i+mx[i]-mn[i]]++; for (int j = 0; j < qmx0[i].size(); j++) ans -= mmx[qmx0[i][j]]; for (int j = 0; j < qmx1[i].size(); j++) ans += mmx[qmx1[i][j]]; for (int j = 0; j < qmn0[i].size(); j++) ans -= mmn[qmn0[i][j]]; for (int j = 0; j < qmn1[i].size(); j++) ans += mmn[qmn1[i][j]]; for (int j = 0; j < qsm0[i].size(); j++) ans -= msm[qsm0[i][j]]; for (int j = 0; j < qsm1[i].size(); j++) ans += msm[qsm1[i][j]]; // clear qmx0[i].clear(); qmn0[i].clear(); qsm0[i].clear(); qmx1[i].clear(); qmn1[i].clear(); qsm1[i].clear(); } return ans; } int a[LIM]; int main() { int z; scanf("%d", &z); while (z--) { int n, w; scanf("%d%d", &n, &w); for (int i = 0; i < n; i++) scanf("%d", a + i); printf("%lld\n", solve(a, n, w)); } }