#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;
void 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++;
}
}
}
}
cout << ans << " ";
}
//* O(n^2)
void consistency1(int n, int k1, int k2) {
int ans = 0;
for(int j=1; j<n-2; j++){
int i=0;
while(i<j){
if(a[i] + a[j] > k1) break;
i++;
}
int leftCt = j-i;
int s= j+1, e = n-1;
int rightCt = 0;
while(s<e){
int sum = a[s] + a[e];
if(sum > k2){
rightCt += (e-s);
e--;
}
else{
s++;
}
}
ans += leftCt * rightCt;
}
cout << ans << " ";
}
//* O(n*logn + n + n*logn) == O(n*logn)
void consistency2(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;
}
cout << 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)
void consistency3(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;
}
cout << ans << " ";
}
void solve() {
int n, k1, k2;
cin >> n >> k1 >> k2;
a.resize(n);
for(int i=0; i<n; i++) cin >> a[i];
bruteforce(n, k1, k2);
consistency1(n, k1, k2);
consistency2(n, k1, k2);
consistency3(n, k1, k2);
cout << 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+IGE7CgoKdm9pZCBicnV0ZWZvcmNlKGludCBuLCBpbnQgazEsIGludCBrMil7CglpbnQgYW5zID0gMDsKCQoJZm9yKGludCBpPTA7IGk8bi0zOyBpKyspewoJCWZvcihpbnQgaj1pKzE7IGo8bi0yOyBqKyspewoJCQlpbnQgbGVmdFN1bSA9IGFbaV0gKyBhW2pdOwoJCQlpZihsZWZ0U3VtIDw9IGsxKSBjb250aW51ZTsKCQkJCgkJCWZvcihpbnQgaz1qKzE7IGs8bi0xOyBrKyspewoJCQkJZm9yKGludCBsPWsrMTsgbDxuOyBsKyspewoJCQkJCWludCByaWdodFN1bSA9IGFba10gKyBhW2xdOwoJCQkJCWlmKHJpZ2h0U3VtID4gazIgKSBhbnMrKzsKCQkJCX0KCQkJfQoJCX0KCX0KCWNvdXQgPDwgYW5zIDw8ICIgIjsKfQoKLy8qIE8obl4yKQp2b2lkIGNvbnNpc3RlbmN5MShpbnQgbiwgaW50IGsxLCBpbnQgazIpIHsKCQoJaW50IGFucyA9IDA7Cglmb3IoaW50IGo9MTsgajxuLTI7IGorKyl7CgkJaW50IGk9MDsKCQl3aGlsZShpPGopewoJCQlpZihhW2ldICsgYVtqXSA+IGsxKSBicmVhazsKCQkJaSsrOwoJCX0KCQlpbnQgbGVmdEN0ID0gai1pOwoJCQoJCWludCAgcz0gaisxLCBlID0gbi0xOwoJCWludCByaWdodEN0ID0gMDsKCQl3aGlsZShzPGUpewoJCQlpbnQgc3VtID0gYVtzXSArIGFbZV07CgkJCWlmKHN1bSA+IGsyKXsKCQkJCXJpZ2h0Q3QgKz0gKGUtcyk7CgkJCQllLS07CgkJCX0KCQkJZWxzZXsKCQkJCXMrKzsKCQkJfQoJCX0KCQlhbnMgKz0gbGVmdEN0ICogcmlnaHRDdDsKCX0KCQoJY291dCA8PCBhbnMgPDwgIiAiOwp9CgoKCgovLyogTyhuKmxvZ24gKyBuICsgbipsb2duKSA9PSBPKG4qbG9nbikKdm9pZCBjb25zaXN0ZW5jeTIoaW50IG4sIGludCBrMSwgaW50IGsyKSB7CgkKCWludCBhbnMgPSAwOwoJCgl2ZWN0b3I8aW50PiBwKG4pOwoJZm9yKGludCBpPTA7IGk8bi0xOyBpKyspewoJCWludCB0YXJnZXQgPSBrMiAtIGFbaV07CgkJaW50IGogPSB1cHBlcl9ib3VuZChhLmJlZ2luKCkgKyBpICsgMSwgYS5lbmQoKSwgdGFyZ2V0KSAtIGEuYmVnaW4oKTsKCQlwW2ldID0gbi1qOwoJfQoJdmVjdG9yPGludD4gcmlnaHRTdWZpeChuKTsKCWZvcihpbnQgaT1uLTI7IGk+PTA7IGktLSl7CgkJcmlnaHRTdWZpeFtpXSA9IHJpZ2h0U3VmaXhbaSsxXSArIHBbaV07Cgl9CgkKCQoJZm9yKGludCBqPTE7IGo8bi0yOyBqKyspewoJCWludCB0YXJnZXQgPSBrMSAtIGFbal07CgkJaW50IGkgPSB1cHBlcl9ib3VuZChhLmJlZ2luKCksIGEuYmVnaW4oKStqLCB0YXJnZXQpIC0gYS5iZWdpbigpOwoJCWludCBsZWZ0Q3QgPSBqLWk7CgoJCWludCByaWdodEN0ID0gcmlnaHRTdWZpeFtqKzFdOwoJCQoJCWFucyArPSBsZWZ0Q3QgKiByaWdodEN0OwoJCQoJfQoKCgljb3V0IDw8IGFucyA8PCAiICI7CgkKfQoKCi8vKiBMZWZ0IENvdW50IFByZSBDb21wdXRhdGlvbiAgOiAKCi8vKiBFZyA6IFsgMSAsIDIgLCAzICwgNCAsIDUgLCA2ICwgOCBdICAgazEgPSA5CgovLyogRW5kaW5nIGF0IGFuYWxvZ3kgOiAKLy8qIAlXZSBhcmUgZmluZGluZyBwYWlycyAoeCx5KSB3aXRoIHN1bSB4K3kgPT0gazEgZW5kaW5nIGF0IHkKCi8vKiBPYnNlcnZhdGlvbiA6IGlmIHdlIGRyZXcgb3V0IHBhdHRlcm5zIGZvciBlYWNoIHBhaXJzICwgaXQgbG9va3MgbGlrZSB0aGlzIDogCi8vKiAgICAgIFsgKDEgLCAyICwgKDMgLCAoNCAsIDUpICwgNikgLCA4KSBdICAgCi8vKiAgICAgCXkgPSAxLDIsMyw0IGNhbid0IGZvcm0gcGFpciB3aXRoIGFueSB4IHN1Y2ggdGhhdCB4K3kgPj0gOQovLyogCSAgICB5ID0gNSBmb3JtcyBwYWlyIHdpdGggeCA9IDQgb25seSAgICAgICAgICAgICAgID0+IGN0ID0gMQovLyogCQl5ID0gNiBmb3JtcyBwYWlyIHdpdGggeCA9ICgzLCA0LCA1KSAgICAgICAgICAgID0+IGN0ID0gMwovLyogCQl5ID0gOCBmb3JtcyBwYWlyIHdpdGggeCA9ICgxLCAyLCAzLCA0LCA1LCA2KSAgID0+IGN0ID0gNgoKLy8qIAlOb3cgd2UgY2FuIHVzZSAyIHB0ciBmcm9tIDFzdCBwYWlyIFt4LCB4KzFdIHN1Y2ggdGhhdCB4ICsgeCArIDEgPj0gazEKLy8qIAkgICAgICAgICAgICAgICAgaSAgIGoKLy8qICAgICAgWyAxICwgMiAsIDMgLCAoNCAsIDUpICwgNiAsIDgpIF0gICAKLy8qIAkJCXBbNV0gPSBtYXgoMCwgMikgPSAyCi8vKiAJCU5vdyB3ZSB3YW50IHRvIG1heGltaXplIHBbNV0gY3RzIHNvIG1vdmUgaSBsZWZ0ID0+IGktLQoKLy8qIAkgICAgICAgICAgIGkgICAgICAgIGoKLy8qICAgICAgWyAxICwgMiAsIDMgLCAoNCAsIDUpICwgNiAsIDgpIF0gICAKLy8qIAkJCTUrMyA8IGsxCi8vKiAJCUludmFsaWQgc28gbW92ZSB0byBuZXh0IHkgPT4gaisrCgovLyogCSAgICAgICAgICAgICAgICBpICAgICAgIGoKLy8qICAgICAgWyAxICwgMiAsIDMgLCAoNCAsIDUgLCA2KSAsIDgpIF0gICAKLy8qIAkJCXBbNl0gPSBtYXgoMCwgMykgPSAzCgovLyogCSAgICAgICAgICAgIGkgICAgICAgICAgIGoKLy8qICAgICAgWyAxICwgMiAsICgzICwgNCAsIDUgLCA2KSAsIDgpIF0gICAKLy8qIAkJCXBbNl0gPSBtYXgoMywgNCkgPSA0CgovLyogCSAgICAgICAgaSAgICAgICAgICAgICAgIGoKLy8qICAgICAgWyAxICwgKDIgLCAzICwgNCAsIDUgLCA2KSAsIDgpIF0gICAKLy8qIAkJCUludmFsaWQgPT4gaisrCgovLyogTyhuICsgbiArIG4gKSA9IE8obikKdm9pZCBjb25zaXN0ZW5jeTMoaW50IG4sIGludCBrMSwgaW50IGsyKSB7CgkKCWludCBhbnMgPSAwOwoJCgl2ZWN0b3I8aW50PiBwKG4pOwoKCXZlY3RvcjxpbnQ+IGxlZnRQcmVmaXgobik7CglpbnQgaT0xOwoJd2hpbGUoaTxuKXsKCQlpZihhW2ldICsgYVtpLTFdID49IGsxKSBicmVhazsKCQlpKys7Cgl9CglpbnQgbGVmdCA9IGktMTsKCWludCByaWdodCA9IGk7CgkKCXdoaWxlKGxlZnQ+PTAgJiYgcmlnaHQ8bil7CgkJaWYoYVtsZWZ0XSArIGFbcmlnaHRdID4gazEpewoJCQlwW3JpZ2h0XSA9IG1heChwW3JpZ2h0XSwgcmlnaHQtbGVmdCk7CgkJCWxlZnQtLTsKCQl9CgkJZWxzZSB7CgkJCXJpZ2h0Kys7CgkJfQoJfQoJZm9yKGludCBpPTE7IGk8bjsgaSsrKXsKCQlsZWZ0UHJlZml4W2ldID0gbGVmdFByZWZpeFtpLTFdICsgcFtpXTsKCX0KCQoKCQoJdmVjdG9yPGludD4gcShuKTsKCgl2ZWN0b3I8aW50PiByaWdodFN1Zml4KG4pOwoJLy8gZm9yKGludCBpPW4tMTsgaT49MDsgaS0tKXsKCS8vIAlyaWdodFN1Zml4W2ldID0gcmlnaHRTdWZpeFtpKzFdICsgcVtpXTsKCS8vIH0KCQoJZm9yKGludCBqPTE7IGo8bi0yOyBqKyspewoJCWludCBsZWZ0Q3QgPSBsZWZ0UHJlZml4W2pdOwoJCWludCByaWdodEN0ID0gcmlnaHRTdWZpeFtqKzFdOyAKCQkKCQlhbnMgKz0gbGVmdEN0ICogcmlnaHRDdDsKCX0KCgoJY291dCA8PCBhbnMgPDwgIiAiOwoJCn0KCgp2b2lkIHNvbHZlKCkgewogICAgCglpbnQgbiwgazEsIGsyOwoJY2luID4+IG4gPj4gazEgPj4gazI7CgkKCWEucmVzaXplKG4pOwoJZm9yKGludCBpPTA7IGk8bjsgaSsrKSBjaW4gPj4gYVtpXTsKICAgIAogICAgYnJ1dGVmb3JjZShuLCBrMSwgazIpOwogICAgY29uc2lzdGVuY3kxKG4sIGsxLCBrMik7CiAgICBjb25zaXN0ZW5jeTIobiwgazEsIGsyKTsKICAgIGNvbnNpc3RlbmN5MyhuLCBrMSwgazIpOwogICAgCiAgICBjb3V0IDw8IGVuZGw7Cgp9CgoKCgoKaW50MzJfdCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CgogICAgaW50IHQgPSAxOwogICAgLy8gY2luID4+IHQ7CiAgICB3aGlsZSAodC0tKSB7CiAgICAgICAgc29sdmUoKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==