#include <bits/stdc++.h>
using namespace std;
#define int long long int
#define double long double
const int M = 1000000007;
const int N = 3e5+9;
const int INF = 2e9+1;
const int MAXN = 100000;
const int LINF = 2000000000000000001;
//_ ***************************** START Below *******************************
vector<int> a;
//* Count of Exactly k = (Atmost k ) - (Atmost k-1 )
int atmostK(int n, int k){
int s = 0, e = 0;
int l = 0;
int ans = 0;
int sum = 0;
while(e<n){
sum += a[e];
if(sum < k){
e++;
}
else if(sum==k){
ans += (l-s);
e++;
}
else{
while(s<=e && sum>k){
sum -= a[s];
s++;
}
if(sum==k) ans += l-s;
e++;
}
}
return ans;
}
int consistency1(int n, int k){
// Handle goal == 0 case
int res = 0;
int i=0;
while(i<n){
while(i<n && a[i] == 1) i++;
if(i==n) break;
int j = i+1;
while(j<n && a[j] == 0) j++;
int ct = j-i;
res += (ct*(ct+1))/2;
i = j;
}
if(k == 0) return res;
return atmostK(n, k) - atmostK(n, k-1);
}
//* Template 1
int consistency2(int n, int k){
// Handle goal == 0 case
int res = 0;
int i=0;
while(i<n){
while(i<n && a[i] == 1) i++;
if(i==n) break;
int j = i+1;
while(j<n && a[j] == 0) j++;
int ct = j-i;
res += (ct*(ct+1))/2;
i = j;
}
if(k == 0) return res;
int big = 0, small = 0;
int s = 0, e = 0;
int l = 0;
int ans = 0;
while(e<n){
big += a[e];
small += a[e];
while(l<=e && small >= k){
small -= a[l];
l++;
}
if(big < k){
e++;
}
else if(big==k){
ans += (l-s);
e++;
}
else{
while(s<=e && big>k){
big -= a[s];
s++;
}
if(big==k) ans += l-s;
e++;
}
}
return ans;
}
//* Template 2
int consistency3(int n, int k){
// Handle goal == 0 case
int res = 0;
int i=0;
while(i<n){
while(i<n && a[i] == 1) i++;
if(i==n) break;
int j = i+1;
while(j<n && a[j] == 0) j++;
int ct = j-i;
res += (ct*(ct+1))/2;
i = j;
}
if(k == 0) return res;
int big = 0, small = 0;
int s = 0, e = 0;
int l = 0;
int ans = 0;
while(e<n){
big += a[e];
small += a[e];
while(l<=e && small >= k){
small -= a[l];
l++;
}
if(big < k){
e++;
}
else{
while(s<=e && big>k){
big -= a[s];
s++;
}
if(big==k) ans += l-s;
e++;
}
}
return ans;
}
int practice(int n, int k){
return 0;
}
void solve() {
int n, k;
cin >> n >> k;
a.resize(n);
for(int i=0; i<n; i++) cin >> a[i];
cout << consistency1(n, k) << " " << consistency2(n,k) << " " << consistency3(n,k) << endl;
// cout << consistency1(n, k) << " -> " << practice(n, k) << endl;
}
int32_t main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50ICAgICAgICAgICAgICBsb25nIGxvbmcgaW50CiNkZWZpbmUgZG91YmxlICAgICAgICAgICBsb25nIGRvdWJsZQoKCmNvbnN0IGludCBNID0gMTAwMDAwMDAwNzsKY29uc3QgaW50IE4gPSAzZTUrOTsKY29uc3QgaW50IElORiA9IDJlOSsxOwpjb25zdCBpbnQgTUFYTiA9IDEwMDAwMDsKY29uc3QgaW50IExJTkYgPSAyMDAwMDAwMDAwMDAwMDAwMDAxOwoKLy9fICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNUQVJUIEJlbG93ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCgoKdmVjdG9yPGludD4gYTsKCi8vKiBDb3VudCBvZiBFeGFjdGx5IGsgPSAoQXRtb3N0IGsgKSAtIChBdG1vc3Qgay0xICkKCmludCBhdG1vc3RLKGludCBuLCBpbnQgayl7CgkJCglpbnQgcyA9IDAsIGUgPSAwOwoJaW50IGwgPSAwOwoJaW50IGFucyA9IDA7CQoJaW50IHN1bSA9IDA7CgkKCQoJd2hpbGUoZTxuKXsKCSAgICBzdW0gKz0gYVtlXTsKCSAgICBpZihzdW0gPCBrKXsKCSAgICAgICAgZSsrOwoJICAgIH0KCSAgICBlbHNlIGlmKHN1bT09ayl7CgkgICAgCWFucyArPSAobC1zKTsKCSAgICAJZSsrOwoJICAgIH0KCSAgICBlbHNlewoJICAgICAgICB3aGlsZShzPD1lICYmIHN1bT5rKXsKCSAgICAgICAgICAgIHN1bSAtPSBhW3NdOwoJICAgICAgICAgICAgcysrOwoJICAgICAgICB9CgkgICAgICAgIGlmKHN1bT09aykgYW5zICs9IGwtczsKCSAgICAgICAgZSsrOwoJICAgIH0KCX0JCiAgICByZXR1cm4gYW5zOwp9CgppbnQgY29uc2lzdGVuY3kxKGludCBuLCBpbnQgayl7CgkJLy8gSGFuZGxlIGdvYWwgPT0gMCBjYXNlIAoJaW50IHJlcyA9IDA7CglpbnQgaT0wOwoJCgl3aGlsZShpPG4pewoJICAgIHdoaWxlKGk8biAmJiBhW2ldID09IDEpIGkrKzsKCSAgICBpZihpPT1uKSBicmVhazsJCgkgICAgaW50IGogPSBpKzE7CgkgICAgd2hpbGUoajxuICYmIGFbal0gPT0gMCkgaisrOwoJICAgIGludCBjdCA9IGotaTsKCSAgICByZXMgKz0gKGN0KihjdCsxKSkvMjsKCSAgICBpID0gajsKCX0KCWlmKGsgPT0gMCkgcmV0dXJuIHJlczsKCQoJCglyZXR1cm4gYXRtb3N0SyhuLCBrKSAtIGF0bW9zdEsobiwgay0xKTsKCQp9CgoKCgovLyogVGVtcGxhdGUgMQoKCmludCBjb25zaXN0ZW5jeTIoaW50IG4sIGludCBrKXsKCQoJLy8gSGFuZGxlIGdvYWwgPT0gMCBjYXNlIAoJaW50IHJlcyA9IDA7CglpbnQgaT0wOwoJCgl3aGlsZShpPG4pewoJICAgIHdoaWxlKGk8biAmJiBhW2ldID09IDEpIGkrKzsKCSAgICBpZihpPT1uKSBicmVhazsJCgkgICAgaW50IGogPSBpKzE7CgkgICAgd2hpbGUoajxuICYmIGFbal0gPT0gMCkgaisrOwoJICAgIGludCBjdCA9IGotaTsKCSAgICByZXMgKz0gKGN0KihjdCsxKSkvMjsKCSAgICBpID0gajsKCX0KCWlmKGsgPT0gMCkgcmV0dXJuIHJlczsJCgkKCQoJCglpbnQgYmlnID0gMCwgc21hbGwgPSAwOwkKCWludCBzID0gMCwgZSA9IDA7CglpbnQgbCA9IDA7CglpbnQgYW5zID0gMDsJCgkKCXdoaWxlKGU8bil7CgkgICAgYmlnICs9IGFbZV07CgkgICAgc21hbGwgKz0gYVtlXTsJCgkgICAgd2hpbGUobDw9ZSAmJiBzbWFsbCA+PSBrKXsKCSAgICAgICAgc21hbGwgLT0gYVtsXTsKCSAgICAgICAgbCsrOwoJICAgIH0JCgkgICAgaWYoYmlnIDwgayl7CgkgICAgICAgIGUrKzsKCSAgICB9CgkgICAgZWxzZSBpZihiaWc9PWspewoJICAgIAlhbnMgKz0gKGwtcyk7CgkgICAgCWUrKzsKCSAgICB9CgkgICAgZWxzZXsKCSAgICAgICAgd2hpbGUoczw9ZSAmJiBiaWc+ayl7CgkgICAgICAgICAgICBiaWcgLT0gYVtzXTsKCSAgICAgICAgICAgIHMrKzsKCSAgICAgICAgfQoJICAgICAgICBpZihiaWc9PWspIGFucyArPSBsLXM7CgkgICAgICAgIGUrKzsKCSAgICB9Cgl9CQoJcmV0dXJuIGFuczsKCn0KCgoKCi8vKiBUZW1wbGF0ZSAyCgppbnQgY29uc2lzdGVuY3kzKGludCBuLCBpbnQgayl7CgkKCS8vIEhhbmRsZSBnb2FsID09IDAgY2FzZSAKCWludCByZXMgPSAwOwoJaW50IGk9MDsKCQoJd2hpbGUoaTxuKXsKCSAgICB3aGlsZShpPG4gJiYgYVtpXSA9PSAxKSBpKys7CgkgICAgaWYoaT09bikgYnJlYWs7CQoJICAgIGludCBqID0gaSsxOwoJICAgIHdoaWxlKGo8biAmJiBhW2pdID09IDApIGorKzsKCSAgICBpbnQgY3QgPSBqLWk7CgkgICAgcmVzICs9IChjdCooY3QrMSkpLzI7CgkgICAgaSA9IGo7Cgl9CglpZihrID09IDApIHJldHVybiByZXM7CQoJCgkKCWludCBiaWcgPSAwLCBzbWFsbCA9IDA7CQoJaW50IHMgPSAwLCBlID0gMDsKCWludCBsID0gMDsKCWludCBhbnMgPSAwOwkKCQoJd2hpbGUoZTxuKXsKCSAgICBiaWcgKz0gYVtlXTsKCSAgICBzbWFsbCArPSBhW2VdOwkKCSAgICB3aGlsZShsPD1lICYmIHNtYWxsID49IGspewoJICAgICAgICBzbWFsbCAtPSBhW2xdOwoJICAgICAgICBsKys7CgkgICAgfQkKCSAgICBpZihiaWcgPCBrKXsKCSAgICAgICAgZSsrOwoJICAgIH0KCSAgICBlbHNlewoJICAgICAgICB3aGlsZShzPD1lICYmIGJpZz5rKXsKCSAgICAgICAgICAgIGJpZyAtPSBhW3NdOwoJICAgICAgICAgICAgcysrOwoJICAgICAgICB9CgkgICAgICAgIGlmKGJpZz09aykgYW5zICs9IGwtczsKCSAgICAgICAgZSsrOwoJICAgIH0KCX0JCglyZXR1cm4gYW5zOwp9CgoKCgoKCgoKCmludCBwcmFjdGljZShpbnQgbiwgaW50IGspewoJCglyZXR1cm4gMDsJCn0KCgoKCnZvaWQgc29sdmUoKSB7CgoJaW50IG4sIGs7CgljaW4gPj4gbiA+PiBrOwoJYS5yZXNpemUobik7Cglmb3IoaW50IGk9MDsgaTxuOyBpKyspIGNpbiA+PiBhW2ldOwoKCWNvdXQgPDwgY29uc2lzdGVuY3kxKG4sIGspIDw8ICIgIiA8PCBjb25zaXN0ZW5jeTIobixrKSA8PCAgIiAiIDw8IGNvbnNpc3RlbmN5MyhuLGspIDw8IGVuZGw7CgkKCS8vIGNvdXQgPDwgY29uc2lzdGVuY3kxKG4sIGspIDw8ICIgLT4gIiA8PCBwcmFjdGljZShuLCBrKSA8PCBlbmRsOwoJCn0KCgoKCgppbnQzMl90IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKCiAgICBpbnQgdCA9IDE7CiAgICBjaW4gPj4gdDsKICAgIHdoaWxlICh0LS0pIHsKICAgICAgICBzb2x2ZSgpOwogICAgfQoKICAgIHJldHVybiAwOwp9