#55192: cpp_answer


yp11451202@yphs.tp.edu.tw (705-38黃鈺潤)


#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;
}