#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
struct Point {
ll f, g;
int id;
};
int n;
ll a, b;
ll S[100005];
Point p[100005];
int bit[100005];
ll all_g[100005];
ll ans = 0;
void update(int x, int val) {
for (; x <= n + 1; x += x & -x) bit[x] += val;
}
int query(int x) {
int res = 0;
for (; x > 0; x -= x & -x) res += bit[x];
return res;
}
// CDQ 分治處理二維偏序
void solve(int L, int R) {
if (L >= R) return;
int mid = (L + R) >> 1;
solve(L, mid);
solve(mid + 1, R);
// 按 f 值排序,若 f 相同則按原始 id 排序
auto cmp = [](const Point& x, const Point& y) {
if (x.f != y.f) return x.f < y.f;
return x.id < y.id;
};
sort(p + L, p + mid + 1, cmp);
sort(p + mid + 1, p + R + 1, cmp);
int i = L;
for (int j = mid + 1; j <= R; j++) {
while (i <= mid && p[i].f <= p[j].f) {
// 條件是 g(i) >= g(j),我們離散化後求逆序
// 這裡將 g 值映射為排名,使用 n+2-rank 來轉為大於等於的查詢
update(p[i].g, 1);
i++;
}
ans += query(n + 1) - query(p[j].g - 1);
}
// 清空 BIT 供下一層使用
for (int k = L; k < i; k++) update(p[k].g, -1);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
while (cin >> n >> a >> b) {
S[0] = 0;
vector<ll> vals;
for (int i = 1; i <= n; i++) {
ll x; cin >> x;
S[i] = S[i - 1] + x;
}
for (int i = 0; i <= n; i++) {
p[i].f = S[i] - a * i;
p[i].g = S[i] - b * i;
p[i].id = i;
vals.push_back(p[i].g);
}
// 離散化 g 值
sort(vals.begin(), vals.end());
vals.erase(unique(vals.begin(), vals.end()), vals.end());
for (int i = 0; i <= n; i++) {
p[i].g = lower_bound(vals.begin(), vals.end(), p[i].g) - vals.begin() + 1;
}
ans = 0;
solve(0, n);
cout << ans << endl;
}
return 0;
}