structBIT { /* ================================================== */ ll tr[maxn]; int sz; voidinit( int N ){ sz = N; fill( tr, tr + sz + 1, 0 ); } voidbuild( int N, ll val[] ){ init( N ); for( int i = 1; i <= N; ++ i ) add( i, val[i] ); } voidadd( int idx, ll val ){ for( int i = idx; i <= sz; i += i & -i ) tr[i] += val; } // 单点修改 a[idx] += val ll ask( int idx ){ ll res = 0; for( int i = idx; i; i -= i & -i ) res += tr[i]; return res; } // 查询前缀和 [1, idx] ll ask( int l, int r ){ returnask( r ) - ask( l - 1 ); } // 查询区间和 [l, r] /* ================================================== */ } bit;
ll a[maxn]; ll sum[maxn];
voidsolve( ){ int n = read( ), M = read( );
disc.add( 0 ); for( int i = 1; i <= n; ++ i ) { a[i] = read( ) - M; sum[i] = sum[i-1] + a[i]; disc.add( sum[i] ); }
disc.init( ); int m = disc.size( );
bit.init( m ); ll ans = 0; // bit.add( disc.get_idx( 0 ), 1 ); for( int i = 0; i <= n; ++ i ) { int x = disc.get_idx( sum[i] ); ans = ( ans + bit.ask( 1, x - 1 ) ) % mod; bit.add( x, 1 ); } cout << ans << '\n'; }