#include <bits/stdc++.h>
using namespace std;
#define int long long int
#define double long double
inline int power(int a, int b) {
int x = 1;
while (b) {
if (b & 1) x *= a;
a *= a;
b >>= 1;
}
return x;
}
const int M = 1000000007;
const int N = 3e5+9;
const int INF = 2e9+1;
const int LINF = 2000000000000000001;
//_ ***************************** START Below *******************************
vector<int> a;
int bruteforce(int n, int k1, int k2){
int ans = 0;
for(int i=0; i<n-2; i++){
for(int j=i+1; j<n-2; j++){
int leftSum = a[i] + a[j];
if(leftSum <= k1) continue;
for(int k=j+1; k<n-1; k++){
for(int l=k+1; l<n; l++){
int rightSum = a[k] + a[l];
if(rightSum > k2 ) ans++;
}
}
}
}
return ans;
}
//* Left Count Pre Computation :
//* Eg : [ 1 , 2 , 3 , 4 , 5 , 6 , 8 ] k1 = 9
//* Ending at analogy :
//* We are finding pairs (x,y) with sum x+y == k1 ending at y
//* Observation : if we drew out patterns for each pairs , it looks like this :
//* [ (1 , 2 , (3 , (4 , 5) , 6) , 8) ]
//* y = 1,2,3,4 can't form pair with any x such that x+y >= 9
//* y = 5 forms pair with x = 4 only => ct = 1
//* y = 6 forms pair with x = (3, 4, 5) => ct = 3
//* y = 8 forms pair with x = (1, 2, 3, 4, 5, 6) => ct = 6
//* Now we can use 2 ptr from 1st pair [x, x+1] such that x + x + 1 >= k1
//* i j
//* [ 1 , 2 , 3 , (4 , 5) , 6 , 8) ]
//* p[5] = max(0, 2) = 2
//* Now we want to maximize p[5] cts so move i left => i--
//* i j
//* [ 1 , 2 , 3 , (4 , 5) , 6 , 8) ]
//* 5+3 < k1
//* Invalid so move to next y => j++
//* i j
//* [ 1 , 2 , 3 , (4 , 5 , 6) , 8) ]
//* p[6] = max(0, 3) = 3
//* i j
//* [ 1 , 2 , (3 , 4 , 5 , 6) , 8) ]
//* p[6] = max(3, 4) = 4
//* i j
//* [ 1 , (2 , 3 , 4 , 5 , 6) , 8) ]
//* Invalid => j++
//* O(n + n + n ) = O(n)
// int consistency(int n, int k1, int k2) {
// int ans = 0;
// vector<int> p(n);
// vector<int> leftPrefix(n);
// int i=1;
// while(i<n){
// if(a[i] + a[i-1] >= k1) break;
// i++;
// }
// int left = i-1;
// int right = i;
// while(left>=0 && right<n){
// if(a[left] + a[right] > k1){
// p[right] = max(p[right], right-left);
// left--;
// }
// else {
// right++;
// }
// }
// for(int i=1; i<n; i++){
// leftPrefix[i] = leftPrefix[i-1] + p[i];
// }
// vector<int> q(n);
// vector<int> rightSufix(n);
// // for(int i=n-1; i>=0; i--){
// // rightSufix[i] = rightSufix[i+1] + q[i];
// // }
// for(int j=1; j<n-2; j++){
// int leftCt = leftPrefix[j];
// int rightCt = rightSufix[j+1];
// ans += leftCt * rightCt;
// }
// return ans;
// }
int consistency1(int n, int k1, int k2) {
//* Suffix
vector<int> pairsInSufix(n);
vector<int> pairsFrom(n);
int s = 0, e = n-1;
while(e-s+1>2){
if(a[s]+a[e] > k2) e--;
else s++;
}
int j = e;
while(s>=0 && e<n){
if(a[e] + a[s] > k2){
pairsFrom[s] = n-e;
s--;
}
else{
e++;
}
}
while(j<n){
pairsFrom[j] = n-j-1;
j++;
}
pairsInSufix[n-1] = pairsFrom[n-1];
for(int i=n-2; i>=0; i--){
pairsInSufix[i] = pairsFrom[i] + pairsInSufix[i+1];
}
int ans = 0;
//* Global 2 Ptr * local 2 Ptr
for(int j=n-3, i=0; j>i; j--){
while(i<j && a[i]+a[j] <= k1) i++;
int left = j-i;
int right = pairsInSufix[j+1];
ans += left*right;
}
return ans;
}
int consistency2(int n, int k1, int k2) {
//* prefix
vector<int> pairsInPrefix(n);
vector<int> pairsEndingAt(n);
int s = 0, e = n-1;
while(e-s+1>2){
if(a[s]+a[e] > k1) e--;
else s++;
}
while(s>=0 && e<n){
if(a[e] + a[s] > k1){
s--;
}
else{
pairsEndingAt[e] = e-s-1;
e++;
}
}
while(e<n){
pairsEndingAt[e] = e;
e++;
}
//* Suffix
vector<int> pairsInSufix(n);
vector<int> pairsFrom(n);
s = 0, e = n-1;
while(e-s+1>2){
if(a[s]+a[e] > k2) e--;
else s++;
}
int y = e;
while(s>=0 && e<n){
if(a[e] + a[s] > k2){
pairsFrom[s] = n-e;
s--;
}
else{
e++;
}
}
while(y<n){
pairsFrom[y] = n-y-1;
y++;
}
pairsInSufix[n-1] = pairsFrom[n-1];
for(int i=n-2; i>=0; i--){
pairsInSufix[i] = pairsFrom[i] + pairsInSufix[i+1];
}
int ans = 0;
for(int i=1; i<n-2; i++){
int left = pairsEndingAt[i];
int right = pairsInSufix[i+1];
ans += left * right;
}
return ans;
}
int practice(int n, int k1, int k2) {
return 0;
}
void solve() {
int n, k1, k2;
cin >> n >> k1 >> k2;
a.resize(n);
for(int i=0; i<n; i++) cin >> a[i];
cout << bruteforce(n, k1, k2) << " ";
cout << consistency1(n, k1, k2) << " ";
cout << consistency2(n, k1, k2) << endl;
// cout << bruteforce(n, k1, k2) << " -> ";
// cout << practice(n, k1, k2) << 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+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50ICAgICAgICAgICAgICBsb25nIGxvbmcgaW50CiNkZWZpbmUgZG91YmxlICAgICAgICAgICBsb25nIGRvdWJsZQppbmxpbmUgaW50IHBvd2VyKGludCBhLCBpbnQgYikgewogICAgaW50IHggPSAxOwogICAgd2hpbGUgKGIpIHsKICAgICAgICBpZiAoYiAmIDEpIHggKj0gYTsKICAgICAgICBhICo9IGE7CiAgICAgICAgYiA+Pj0gMTsKICAgIH0KICAgIHJldHVybiB4Owp9CgoKY29uc3QgaW50IE0gPSAxMDAwMDAwMDA3Owpjb25zdCBpbnQgTiA9IDNlNSs5Owpjb25zdCBpbnQgSU5GID0gMmU5KzE7CmNvbnN0IGludCBMSU5GID0gMjAwMDAwMDAwMDAwMDAwMDAwMTsKCi8vXyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTVEFSVCBCZWxvdyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoKCnZlY3RvcjxpbnQ+IGE7CgoKaW50IGJydXRlZm9yY2UoaW50IG4sIGludCBrMSwgaW50IGsyKXsKCWludCBhbnMgPSAwOwoJCglmb3IoaW50IGk9MDsgaTxuLTI7IGkrKyl7CgkJZm9yKGludCBqPWkrMTsgajxuLTI7IGorKyl7CgkJCWludCBsZWZ0U3VtID0gYVtpXSArIGFbal07CgkJCWlmKGxlZnRTdW0gPD0gazEpIGNvbnRpbnVlOwoJCQkKCQkJZm9yKGludCBrPWorMTsgazxuLTE7IGsrKyl7CgkJCQlmb3IoaW50IGw9aysxOyBsPG47IGwrKyl7CgkJCQkJaW50IHJpZ2h0U3VtID0gYVtrXSArIGFbbF07CgkJCQkJaWYocmlnaHRTdW0gPiBrMiApIGFucysrOwoJCQkJfQoJCQl9CgkJfQoJfQoJcmV0dXJuIGFuczsKfQoKCgoKCgovLyogTGVmdCBDb3VudCBQcmUgQ29tcHV0YXRpb24gIDogCgovLyogRWcgOiBbIDEgLCAyICwgMyAsIDQgLCA1ICwgNiAsIDggXSAgIGsxID0gOQoKLy8qIEVuZGluZyBhdCBhbmFsb2d5IDogCi8vKiAJV2UgYXJlIGZpbmRpbmcgcGFpcnMgKHgseSkgd2l0aCBzdW0geCt5ID09IGsxIGVuZGluZyBhdCB5CgovLyogT2JzZXJ2YXRpb24gOiBpZiB3ZSBkcmV3IG91dCBwYXR0ZXJucyBmb3IgZWFjaCBwYWlycyAsIGl0IGxvb2tzIGxpa2UgdGhpcyA6IAovLyogICAgICBbICgxICwgMiAsICgzICwgKDQgLCA1KSAsIDYpICwgOCkgXSAgIAovLyogICAgIAl5ID0gMSwyLDMsNCBjYW4ndCBmb3JtIHBhaXIgd2l0aCBhbnkgeCBzdWNoIHRoYXQgeCt5ID49IDkKLy8qIAkgICAgeSA9IDUgZm9ybXMgcGFpciB3aXRoIHggPSA0IG9ubHkgICAgICAgICAgICAgICA9PiBjdCA9IDEKLy8qIAkJeSA9IDYgZm9ybXMgcGFpciB3aXRoIHggPSAoMywgNCwgNSkgICAgICAgICAgICA9PiBjdCA9IDMKLy8qIAkJeSA9IDggZm9ybXMgcGFpciB3aXRoIHggPSAoMSwgMiwgMywgNCwgNSwgNikgICA9PiBjdCA9IDYKCi8vKiAJTm93IHdlIGNhbiB1c2UgMiBwdHIgZnJvbSAxc3QgcGFpciBbeCwgeCsxXSBzdWNoIHRoYXQgeCArIHggKyAxID49IGsxCi8vKiAJICAgICAgICAgICAgICAgIGkgICBqCi8vKiAgICAgIFsgMSAsIDIgLCAzICwgKDQgLCA1KSAsIDYgLCA4KSBdICAgCi8vKiAJCQlwWzVdID0gbWF4KDAsIDIpID0gMgovLyogCQlOb3cgd2Ugd2FudCB0byBtYXhpbWl6ZSBwWzVdIGN0cyBzbyBtb3ZlIGkgbGVmdCA9PiBpLS0KCi8vKiAJICAgICAgICAgICBpICAgICAgICBqCi8vKiAgICAgIFsgMSAsIDIgLCAzICwgKDQgLCA1KSAsIDYgLCA4KSBdICAgCi8vKiAJCQk1KzMgPCBrMQovLyogCQlJbnZhbGlkIHNvIG1vdmUgdG8gbmV4dCB5ID0+IGorKwoKLy8qIAkgICAgICAgICAgICAgICAgaSAgICAgICBqCi8vKiAgICAgIFsgMSAsIDIgLCAzICwgKDQgLCA1ICwgNikgLCA4KSBdICAgCi8vKiAJCQlwWzZdID0gbWF4KDAsIDMpID0gMwoKLy8qIAkgICAgICAgICAgICBpICAgICAgICAgICBqCi8vKiAgICAgIFsgMSAsIDIgLCAoMyAsIDQgLCA1ICwgNikgLCA4KSBdICAgCi8vKiAJCQlwWzZdID0gbWF4KDMsIDQpID0gNAoKLy8qIAkgICAgICAgIGkgICAgICAgICAgICAgICBqCi8vKiAgICAgIFsgMSAsICgyICwgMyAsIDQgLCA1ICwgNikgLCA4KSBdICAgCi8vKiAJCQlJbnZhbGlkID0+IGorKwoKLy8qIE8obiArIG4gKyBuICkgPSBPKG4pCgovLyBpbnQgY29uc2lzdGVuY3koaW50IG4sIGludCBrMSwgaW50IGsyKSB7CgkKLy8gCWludCBhbnMgPSAwOwoJCi8vIAl2ZWN0b3I8aW50PiBwKG4pOwoKLy8gCXZlY3RvcjxpbnQ+IGxlZnRQcmVmaXgobik7Ci8vIAlpbnQgaT0xOwovLyAJd2hpbGUoaTxuKXsKLy8gCQlpZihhW2ldICsgYVtpLTFdID49IGsxKSBicmVhazsKLy8gCQlpKys7Ci8vIAl9Ci8vIAlpbnQgbGVmdCA9IGktMTsKLy8gCWludCByaWdodCA9IGk7CgkKLy8gCXdoaWxlKGxlZnQ+PTAgJiYgcmlnaHQ8bil7Ci8vIAkJaWYoYVtsZWZ0XSArIGFbcmlnaHRdID4gazEpewovLyAJCQlwW3JpZ2h0XSA9IG1heChwW3JpZ2h0XSwgcmlnaHQtbGVmdCk7Ci8vIAkJCWxlZnQtLTsKLy8gCQl9Ci8vIAkJZWxzZSB7Ci8vIAkJCXJpZ2h0Kys7Ci8vIAkJfQovLyAJfQovLyAJZm9yKGludCBpPTE7IGk8bjsgaSsrKXsKLy8gCQlsZWZ0UHJlZml4W2ldID0gbGVmdFByZWZpeFtpLTFdICsgcFtpXTsKLy8gCX0KCQoKCQovLyAJdmVjdG9yPGludD4gcShuKTsKCi8vIAl2ZWN0b3I8aW50PiByaWdodFN1Zml4KG4pOwovLyAJLy8gZm9yKGludCBpPW4tMTsgaT49MDsgaS0tKXsKLy8gCS8vIAlyaWdodFN1Zml4W2ldID0gcmlnaHRTdWZpeFtpKzFdICsgcVtpXTsKLy8gCS8vIH0KCQovLyAJZm9yKGludCBqPTE7IGo8bi0yOyBqKyspewovLyAJCWludCBsZWZ0Q3QgPSBsZWZ0UHJlZml4W2pdOwovLyAJCWludCByaWdodEN0ID0gcmlnaHRTdWZpeFtqKzFdOyAKCQkKLy8gCQlhbnMgKz0gbGVmdEN0ICogcmlnaHRDdDsKLy8gCX0KCgovLyAJcmV0dXJuIGFuczsKCQovLyB9CgoKCgoKCgoKCgoKCgoKCgoKaW50IGNvbnNpc3RlbmN5MShpbnQgbiwgaW50IGsxLCBpbnQgazIpIHsKCQoJLy8qIFN1ZmZpeCAKCXZlY3RvcjxpbnQ+IHBhaXJzSW5TdWZpeChuKTsKCXZlY3RvcjxpbnQ+IHBhaXJzRnJvbShuKTsKCQoJaW50IHMgPSAwLCBlID0gbi0xOwoJd2hpbGUoZS1zKzE+Mil7CgkJaWYoYVtzXSthW2VdID4gazIpCWUtLTsKCQllbHNlIHMrKzsKCX0KCWludCBqID0gZTsKCQoJd2hpbGUocz49MCAmJiBlPG4pewoJCWlmKGFbZV0gKyBhW3NdID4gazIpewoJCQlwYWlyc0Zyb21bc10gPSBuLWU7CgkJCXMtLTsKCQl9CgkJZWxzZXsKCQkJZSsrOwoJCX0KCX0KCXdoaWxlKGo8bil7CgkJcGFpcnNGcm9tW2pdID0gbi1qLTE7CgkJaisrOwoJfQoJCglwYWlyc0luU3VmaXhbbi0xXSA9IHBhaXJzRnJvbVtuLTFdOwoJZm9yKGludCBpPW4tMjsgaT49MDsgaS0tKXsKCQlwYWlyc0luU3VmaXhbaV0gPSBwYWlyc0Zyb21baV0gKyBwYWlyc0luU3VmaXhbaSsxXTsKCX0KCQoJCglpbnQgYW5zID0gMDsKCQoJLy8qIEdsb2JhbCAyIFB0ciAqIGxvY2FsIDIgUHRyIAoJZm9yKGludCBqPW4tMywgaT0wOyBqPmk7IGotLSl7CgkJd2hpbGUoaTxqICYmIGFbaV0rYVtqXSA8PSBrMSkgaSsrOwoJCQoJCWludCBsZWZ0ID0gai1pOwoJCWludCByaWdodCA9IHBhaXJzSW5TdWZpeFtqKzFdOwoJCQoJCWFucyArPSBsZWZ0KnJpZ2h0OwoJfQoJCglyZXR1cm4gYW5zOwp9CgoKCgoKCmludCBjb25zaXN0ZW5jeTIoaW50IG4sIGludCBrMSwgaW50IGsyKSB7CgkKCS8vKiBwcmVmaXggCgl2ZWN0b3I8aW50PiBwYWlyc0luUHJlZml4KG4pOwoJdmVjdG9yPGludD4gcGFpcnNFbmRpbmdBdChuKTsKCQoJaW50IHMgPSAwLCBlID0gbi0xOwoJd2hpbGUoZS1zKzE+Mil7CgkJaWYoYVtzXSthW2VdID4gazEpCWUtLTsKCQllbHNlIHMrKzsKCX0KCQoJd2hpbGUocz49MCAmJiBlPG4pewoJCWlmKGFbZV0gKyBhW3NdID4gazEpewoJCQlzLS07CgkJfQoJCWVsc2V7CgkJCXBhaXJzRW5kaW5nQXRbZV0gPSBlLXMtMTsKCQkJZSsrOwoJCX0KCX0KCXdoaWxlKGU8bil7CgkJcGFpcnNFbmRpbmdBdFtlXSA9IGU7CgkJZSsrOwoJfQoJCgkKCQoJCgkKCS8vKiBTdWZmaXggCgkKCXZlY3RvcjxpbnQ+IHBhaXJzSW5TdWZpeChuKTsKCXZlY3RvcjxpbnQ+IHBhaXJzRnJvbShuKTsKCQoJcyA9IDAsIGUgPSBuLTE7CgkKCXdoaWxlKGUtcysxPjIpewoJCWlmKGFbc10rYVtlXSA+IGsyKQllLS07CgkJZWxzZSBzKys7Cgl9CglpbnQgeSA9IGU7CgkKCXdoaWxlKHM+PTAgJiYgZTxuKXsKCQlpZihhW2VdICsgYVtzXSA+IGsyKXsKCQkJcGFpcnNGcm9tW3NdID0gbi1lOwoJCQlzLS07CgkJfQoJCWVsc2V7CgkJCWUrKzsKCQl9Cgl9Cgl3aGlsZSh5PG4pewoJCXBhaXJzRnJvbVt5XSA9IG4teS0xOwoJCXkrKzsKCX0KCQoJcGFpcnNJblN1Zml4W24tMV0gPSBwYWlyc0Zyb21bbi0xXTsKCWZvcihpbnQgaT1uLTI7IGk+PTA7IGktLSl7CgkJcGFpcnNJblN1Zml4W2ldID0gcGFpcnNGcm9tW2ldICsgcGFpcnNJblN1Zml4W2krMV07Cgl9CgkKCQoJaW50IGFucyA9IDA7Cglmb3IoaW50IGk9MTsgaTxuLTI7IGkrKyl7CgkJaW50IGxlZnQgPSBwYWlyc0VuZGluZ0F0W2ldOwoJCWludCByaWdodCA9IHBhaXJzSW5TdWZpeFtpKzFdOwoJCQoJCWFucyArPSBsZWZ0ICogcmlnaHQ7Cgl9CgkKCXJldHVybiBhbnM7Cn0KCgoKCgoKCgoKCgoKaW50IHByYWN0aWNlKGludCBuLCBpbnQgazEsIGludCBrMikgewogCglyZXR1cm4gMDsKIAp9CgoKCgoKCgoKCgp2b2lkIHNvbHZlKCkgewogICAgCglpbnQgbiwgazEsIGsyOwoJY2luID4+IG4gPj4gazEgPj4gazI7CgkKCWEucmVzaXplKG4pOwoJZm9yKGludCBpPTA7IGk8bjsgaSsrKSBjaW4gPj4gYVtpXTsKICAgIAogICAgY291dCA8PCBicnV0ZWZvcmNlKG4sIGsxLCBrMikgPDwgIiAiOwogICAgY291dCA8PCBjb25zaXN0ZW5jeTEobiwgazEsIGsyKSA8PCAiICI7CiAgICBjb3V0IDw8IGNvbnNpc3RlbmN5MihuLCBrMSwgazIpIDw8IGVuZGw7CiAgICAKICAgIAogICAgLy8gY291dCA8PCBicnV0ZWZvcmNlKG4sIGsxLCBrMikgPDwgIiAtPiAiOwogICAgLy8gY291dCA8PCBwcmFjdGljZShuLCBrMSwgazIpIDw8IGVuZGw7CiAgICAKfQoKCgoKCmludDMyX3QgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7IGNvdXQudGllKDApOwoKICAgIGludCB0ID0gMTsKICAgIGNpbiA+PiB0OwogICAgd2hpbGUgKHQtLSkgewogICAgICAgIHNvbHZlKCk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=