#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-3; 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;
}
//* O(n^2)
//* [ 1 2 2 2 3 ] , k1 = 3, k2 = 3
//* i j | s e
//* [ ( 1 2 2 2 ) |(2 3) ]
//* 2 * 1
//* i j | s e
//* [ 1 ( 2 2 ) |(2 2 3) ]
//* 1 * 3
int consistency1(int n, int k1, int k2) {
int ans = 0;
int i = 0, j = n-3;
while(i<j){
if(a[i] + a[j] <= k1){
i++;
}
else{
int right = 0;
int s = j+1;
int e = n-1;
while(s<e){
if(a[s]+a[e] <= k2){
s++;
}
else{
right += e-s;
e--;
}
}
int left = j-i;
ans += left*right;
j--;
}
}
return ans;
}
//* O(n^2)
int consistency2(int n, int k1, int k2) {
int ans = 0;
for(int j=1; j<n-2; j++){
int i=0;
while(i<j && a[i]+a[j] <= k1) i++;
int left = j-i;
int s= j+1, e = n-1;
int right = 0;
while(s<e){
if(a[s]+a[e] > k2){
right += (e-s);
e--;
}
else{
s++;
}
}
ans += left * right;
}
return ans;
}
//* O(n*logn + n + n*logn) == O(n*logn)
int consistency3(int n, int k1, int k2) {
int ans = 0;
vector<int> p(n);
for(int i=0; i<n-1; i++){
int target = k2 - a[i];
int j = upper_bound(a.begin() + i + 1, a.end(), target) - a.begin();
p[i] = n-j;
}
vector<int> rightSufix(n);
for(int i=n-2; i>=0; i--){
rightSufix[i] = rightSufix[i+1] + p[i];
}
for(int j=1; j<n-2; j++){
int target = k1 - a[j];
int i = upper_bound(a.begin(), a.begin()+j, target) - a.begin();
int leftCt = j-i;
int rightCt = rightSufix[j+1];
ans += leftCt * rightCt;
}
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 consistency4(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 practice(int n, int k1, int k2) {
int ans = 0;
return ans;
}
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) << " ";
cout << consistency3(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+IGE7CgoKaW50IGJydXRlZm9yY2UoaW50IG4sIGludCBrMSwgaW50IGsyKXsKCWludCBhbnMgPSAwOwoJCglmb3IoaW50IGk9MDsgaTxuLTM7IGkrKyl7CgkJZm9yKGludCBqPWkrMTsgajxuLTI7IGorKyl7CgkJCWludCBsZWZ0U3VtID0gYVtpXSArIGFbal07CgkJCWlmKGxlZnRTdW0gPD0gazEpIGNvbnRpbnVlOwoJCQkKCQkJZm9yKGludCBrPWorMTsgazxuLTE7IGsrKyl7CgkJCQlmb3IoaW50IGw9aysxOyBsPG47IGwrKyl7CgkJCQkJaW50IHJpZ2h0U3VtID0gYVtrXSArIGFbbF07CgkJCQkJaWYocmlnaHRTdW0gPiBrMiApIGFucysrOwoJCQkJfQoJCQl9CgkJfQoJfQoJcmV0dXJuIGFuczsKfQoKCgoKCi8vKiBPKG5eMikKCi8vKiBbIDEgMiAyIDIgMyBdICwgazEgPSAzLCBrMiA9IDMKCi8vKiAgICAgaSAgICAgIGogICB8IHMgZQovLyogWyAoIDEgMiAyICAyICkgfCgyIDMpIF0KLy8qICAgICAJMiAgICAgICogIDEKCi8vKiAgICAgICBpIGogICB8IHMgICBlCi8vKiBbIDEgKCAyIDIgKSB8KDIgMiAzKSBdCi8vKiAgICAgICAgMSAgICAqICAgMwoKaW50IGNvbnNpc3RlbmN5MShpbnQgbiwgaW50IGsxLCBpbnQgazIpIHsKCQoJaW50IGFucyA9IDA7CgoJaW50IGkgPSAwLCBqID0gbi0zOwoKCXdoaWxlKGk8ail7CgkJaWYoYVtpXSArIGFbal0gPD0gazEpewoJCQlpKys7CgkJfQoJCWVsc2V7CgkJCWludCByaWdodCA9IDA7CgkJCWludCBzID0gaisxOwoJCQlpbnQgZSA9IG4tMTsKCQkJd2hpbGUoczxlKXsKCQkJCWlmKGFbc10rYVtlXSA8PSBrMil7CgkJCQkJcysrOwoJCQkJfQoJCQkJZWxzZXsKCQkJCQlyaWdodCArPSBlLXM7CgkJCQkJZS0tOwoJCQkJfQoJCQl9CgkJCQoJCQlpbnQgbGVmdCA9IGotaTsKCQkJCgkJCWFucyArPSBsZWZ0KnJpZ2h0OwoJCQkKCQkJai0tOwoJCX0KCX0KCgoJcmV0dXJuIGFuczsKCQp9CgoKLy8qIE8obl4yKQppbnQgY29uc2lzdGVuY3kyKGludCBuLCBpbnQgazEsIGludCBrMikgewoJCglpbnQgYW5zID0gMDsKCWZvcihpbnQgaj0xOyBqPG4tMjsgaisrKXsKCQlpbnQgaT0wOwoJCXdoaWxlKGk8aiAmJiBhW2ldK2Fbal0gPD0gazEpIGkrKzsKCQlpbnQgbGVmdCA9IGotaTsKCQkKCQlpbnQgIHM9IGorMSwgZSA9IG4tMTsKCQlpbnQgcmlnaHQgPSAwOwoJCXdoaWxlKHM8ZSl7CgkJCWlmKGFbc10rYVtlXSA+IGsyKXsKCQkJCXJpZ2h0ICs9IChlLXMpOwoJCQkJZS0tOwoJCQl9CgkJCWVsc2V7CgkJCQlzKys7CgkJCX0KCQl9CgkJYW5zICs9IGxlZnQgKiByaWdodDsKCX0KCQoJcmV0dXJuIGFuczsKfQoKCgoKLy8qIE8obipsb2duICsgbiArIG4qbG9nbikgPT0gTyhuKmxvZ24pCmludCBjb25zaXN0ZW5jeTMoaW50IG4sIGludCBrMSwgaW50IGsyKSB7CgkKCWludCBhbnMgPSAwOwoJCgl2ZWN0b3I8aW50PiBwKG4pOwoJZm9yKGludCBpPTA7IGk8bi0xOyBpKyspewoJCWludCB0YXJnZXQgPSBrMiAtIGFbaV07CgkJaW50IGogPSB1cHBlcl9ib3VuZChhLmJlZ2luKCkgKyBpICsgMSwgYS5lbmQoKSwgdGFyZ2V0KSAtIGEuYmVnaW4oKTsKCQlwW2ldID0gbi1qOwoJfQoJdmVjdG9yPGludD4gcmlnaHRTdWZpeChuKTsKCWZvcihpbnQgaT1uLTI7IGk+PTA7IGktLSl7CgkJcmlnaHRTdWZpeFtpXSA9IHJpZ2h0U3VmaXhbaSsxXSArIHBbaV07Cgl9CgkKCQoJZm9yKGludCBqPTE7IGo8bi0yOyBqKyspewoJCWludCB0YXJnZXQgPSBrMSAtIGFbal07CgkJaW50IGkgPSB1cHBlcl9ib3VuZChhLmJlZ2luKCksIGEuYmVnaW4oKStqLCB0YXJnZXQpIC0gYS5iZWdpbigpOwoJCWludCBsZWZ0Q3QgPSBqLWk7CgoJCWludCByaWdodEN0ID0gcmlnaHRTdWZpeFtqKzFdOwoJCQoJCWFucyArPSBsZWZ0Q3QgKiByaWdodEN0OwoJCQoJfQoKCglyZXR1cm4gYW5zOwoJCn0KCgovLyogTGVmdCBDb3VudCBQcmUgQ29tcHV0YXRpb24gIDogCgovLyogRWcgOiBbIDEgLCAyICwgMyAsIDQgLCA1ICwgNiAsIDggXSAgIGsxID0gOQoKLy8qIEVuZGluZyBhdCBhbmFsb2d5IDogCi8vKiAJV2UgYXJlIGZpbmRpbmcgcGFpcnMgKHgseSkgd2l0aCBzdW0geCt5ID09IGsxIGVuZGluZyBhdCB5CgovLyogT2JzZXJ2YXRpb24gOiBpZiB3ZSBkcmV3IG91dCBwYXR0ZXJucyBmb3IgZWFjaCBwYWlycyAsIGl0IGxvb2tzIGxpa2UgdGhpcyA6IAovLyogICAgICBbICgxICwgMiAsICgzICwgKDQgLCA1KSAsIDYpICwgOCkgXSAgIAovLyogICAgIAl5ID0gMSwyLDMsNCBjYW4ndCBmb3JtIHBhaXIgd2l0aCBhbnkgeCBzdWNoIHRoYXQgeCt5ID49IDkKLy8qIAkgICAgeSA9IDUgZm9ybXMgcGFpciB3aXRoIHggPSA0IG9ubHkgICAgICAgICAgICAgICA9PiBjdCA9IDEKLy8qIAkJeSA9IDYgZm9ybXMgcGFpciB3aXRoIHggPSAoMywgNCwgNSkgICAgICAgICAgICA9PiBjdCA9IDMKLy8qIAkJeSA9IDggZm9ybXMgcGFpciB3aXRoIHggPSAoMSwgMiwgMywgNCwgNSwgNikgICA9PiBjdCA9IDYKCi8vKiAJTm93IHdlIGNhbiB1c2UgMiBwdHIgZnJvbSAxc3QgcGFpciBbeCwgeCsxXSBzdWNoIHRoYXQgeCArIHggKyAxID49IGsxCi8vKiAJICAgICAgICAgICAgICAgIGkgICBqCi8vKiAgICAgIFsgMSAsIDIgLCAzICwgKDQgLCA1KSAsIDYgLCA4KSBdICAgCi8vKiAJCQlwWzVdID0gbWF4KDAsIDIpID0gMgovLyogCQlOb3cgd2Ugd2FudCB0byBtYXhpbWl6ZSBwWzVdIGN0cyBzbyBtb3ZlIGkgbGVmdCA9PiBpLS0KCi8vKiAJICAgICAgICAgICBpICAgICAgICBqCi8vKiAgICAgIFsgMSAsIDIgLCAzICwgKDQgLCA1KSAsIDYgLCA4KSBdICAgCi8vKiAJCQk1KzMgPCBrMQovLyogCQlJbnZhbGlkIHNvIG1vdmUgdG8gbmV4dCB5ID0+IGorKwoKLy8qIAkgICAgICAgICAgICAgICAgaSAgICAgICBqCi8vKiAgICAgIFsgMSAsIDIgLCAzICwgKDQgLCA1ICwgNikgLCA4KSBdICAgCi8vKiAJCQlwWzZdID0gbWF4KDAsIDMpID0gMwoKLy8qIAkgICAgICAgICAgICBpICAgICAgICAgICBqCi8vKiAgICAgIFsgMSAsIDIgLCAoMyAsIDQgLCA1ICwgNikgLCA4KSBdICAgCi8vKiAJCQlwWzZdID0gbWF4KDMsIDQpID0gNAoKLy8qIAkgICAgICAgIGkgICAgICAgICAgICAgICBqCi8vKiAgICAgIFsgMSAsICgyICwgMyAsIDQgLCA1ICwgNikgLCA4KSBdICAgCi8vKiAJCQlJbnZhbGlkID0+IGorKwoKLy8qIE8obiArIG4gKyBuICkgPSBPKG4pCmludCBjb25zaXN0ZW5jeTQoaW50IG4sIGludCBrMSwgaW50IGsyKSB7CgkKCWludCBhbnMgPSAwOwoJCgl2ZWN0b3I8aW50PiBwKG4pOwoKCXZlY3RvcjxpbnQ+IGxlZnRQcmVmaXgobik7CglpbnQgaT0xOwoJd2hpbGUoaTxuKXsKCQlpZihhW2ldICsgYVtpLTFdID49IGsxKSBicmVhazsKCQlpKys7Cgl9CglpbnQgbGVmdCA9IGktMTsKCWludCByaWdodCA9IGk7CgkKCXdoaWxlKGxlZnQ+PTAgJiYgcmlnaHQ8bil7CgkJaWYoYVtsZWZ0XSArIGFbcmlnaHRdID4gazEpewoJCQlwW3JpZ2h0XSA9IG1heChwW3JpZ2h0XSwgcmlnaHQtbGVmdCk7CgkJCWxlZnQtLTsKCQl9CgkJZWxzZSB7CgkJCXJpZ2h0Kys7CgkJfQoJfQoJZm9yKGludCBpPTE7IGk8bjsgaSsrKXsKCQlsZWZ0UHJlZml4W2ldID0gbGVmdFByZWZpeFtpLTFdICsgcFtpXTsKCX0KCQoKCQoJdmVjdG9yPGludD4gcShuKTsKCgl2ZWN0b3I8aW50PiByaWdodFN1Zml4KG4pOwoJLy8gZm9yKGludCBpPW4tMTsgaT49MDsgaS0tKXsKCS8vIAlyaWdodFN1Zml4W2ldID0gcmlnaHRTdWZpeFtpKzFdICsgcVtpXTsKCS8vIH0KCQoJZm9yKGludCBqPTE7IGo8bi0yOyBqKyspewoJCWludCBsZWZ0Q3QgPSBsZWZ0UHJlZml4W2pdOwoJCWludCByaWdodEN0ID0gcmlnaHRTdWZpeFtqKzFdOyAKCQkKCQlhbnMgKz0gbGVmdEN0ICogcmlnaHRDdDsKCX0KCgoJcmV0dXJuIGFuczsKCQp9CgoKCgoKCgoKCgoKCgoKCgoKCgppbnQgcHJhY3RpY2UoaW50IG4sIGludCBrMSwgaW50IGsyKSB7CgkKCWludCBhbnMgPSAwOwoKCQoKCglyZXR1cm4gYW5zOwoJCn0KCgp2b2lkIHNvbHZlKCkgewogICAgCglpbnQgbiwgazEsIGsyOwoJY2luID4+IG4gPj4gazEgPj4gazI7CgkKCWEucmVzaXplKG4pOwoJZm9yKGludCBpPTA7IGk8bjsgaSsrKSBjaW4gPj4gYVtpXTsKICAgIAogICAgY291dCA8PCBicnV0ZWZvcmNlKG4sIGsxLCBrMikgPDwgIiAiOwogICAgY291dCA8PCBjb25zaXN0ZW5jeTEobiwgazEsIGsyKSA8PCAiICI7CiAgICBjb3V0IDw8IGNvbnNpc3RlbmN5MihuLCBrMSwgazIpIDw8ICIgIjsKICAgIGNvdXQgPDwgY29uc2lzdGVuY3kzKG4sIGsxLCBrMikgPDwgZW5kbDsKICAgIAogICAgCiAgICBjb3V0IDw8IGJydXRlZm9yY2UobiwgazEsIGsyKSA8PCAiIC0+ICI7CiAgICBjb3V0IDw8IHByYWN0aWNlKG4sIGsxLCBrMikgPDwgZW5kbDsKICAgIAp9CgoKCgoKaW50MzJfdCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CgogICAgaW50IHQgPSAxOwogICAgY2luID4+IHQ7CiAgICB3aGlsZSAodC0tKSB7CiAgICAgICAgc29sdmUoKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==