Problem:
Score : 600 points

Problem Statement

You are given an integer sequence of length N, a = {a_1, a_2, …, a_N}, and an integer K.

a has N(N+1)/2 non-empty contiguous subsequences, {a_l, a_{l+1}, …, a_r} (1 ≤ l ≤ r ≤ N). Among them, how many have an arithmetic mean that is greater than or equal to K?

Constraints

All input values are integers.

1 ≤ N ≤ 2 \times 10^5

1 ≤ K ≤ 10^9

1 ≤ a_i ≤ 10^9

Input

Input is given from Standard Input in the following format:

N K
a_1
a_2
:
a_N

Output

Print the number of the non-empty contiguous subsequences with an arithmetic mean that is greater than or equal to K.

Sample Input 1

3 6
7
5
7

Sample Output 1

5

All the non-empty contiguous subsequences of a are listed below:

{a_1} = {7}

{a_1, a_2} = {7, 5}

{a_1, a_2, a_3} = {7, 5, 7}

{a_2} = {5}

{a_2, a_3} = {5, 7}

{a_3} = {7}

Their means are 7, 6, 19/3, 5, 6 and 7, respectively, and five among them are 6 or greater. Note that {a_1} and {a_3} are indistinguishable by the values of their elements, but we count them individually.

Sample Input 2

1 2
1

Sample Output 2

0

Sample Input 3

7 26
10
20
30
40
30
20
10

Sample Output 3

13

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using static System.Console;
using static System.Convert;
using static System.Math;
//using Debug;
//using static System.Globalization.CultureInfo;
//using Edge = Pair<long, int>;
using System.Text;
class Program
{
    static void Main(string[] args)
    {
        var sw = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false };
        Console.SetOut(sw);
        Solve();
        Console.Out.Flush();
        //WriteLine(Solve());
    }
    static int num;
    static void Solve()
    {
        long k;
        Input.Make(out num, out k);
        var ar = Input.ar1D(num);
        var qq = new long[num + 1];
        var s = 0L;
        for (var i = 1; i <= num; i++)
            qq[i] = (s = s + ar[i - 1]) - k * i;
        WriteLine(Inversion(qq));
    }
    public static long Inversion(long[] ar)
    {
        var dic = new Dictionary<long,int>();
        var d = 0;
        var aar = new long[ar.Length];
        Array.Copy(ar, aar, ar.Length);
        Array.Sort(aar);
        //座圧
        foreach (var v in aar)
            if (!dic.ContainsKey(v))
                dic[v] = ++d;
        var seg = new SegmentTree<int>(ar.Length + 1, 0, (a, b) => a + b,(a,b)=>a+b);
        //var bit = new BIT(num + 2);
        var res = 0L;
        for (var i = 0; i < ar.Length; i++)
        {
            res += seg.Query(0,dic[ar[i]]+1);
            seg.Update(dic[ar[i]], 1);
            //res+=bit[dic[ar[i]]];
           // bit.add(dic[ar[i]], 1);
        }
        return res;
    }
}

public class Input
{
    public static string read => ReadLine().Trim();
    public static int[] ar => read.Split(' ').Select(int.Parse).ToArray();
    public static int num => ToInt32(read);
    public static long[] arL => read.Split(' ').Select(long.Parse).ToArray();
    public static long numL => ToInt64(read);
    public static char[][] gred(int h)
        => Enumerable.Repeat(0, h).Select(_ => read.ToCharArray()).ToArray();
    public static int[] ar1D(int n)
        => Enumerable.Repeat(0, n).Select(_ => num).ToArray();
    public static long[] arL1D(int n)
        => Enumerable.Repeat(0, n).Select(_ => numL).ToArray();
    public static string[] strs(int n)
        => Enumerable.Repeat(0, n).Select(_ => read).ToArray();
    public static int[][] ar2D(int n)
        => Enumerable.Repeat(0, n).Select(_ => ar).ToArray();
    public static long[][] arL2D(int n)
        => Enumerable.Repeat(0, n).Select(_ => arL).ToArray();
    public static T getValue<T>(string g)
    {
        var t = typeof(T);
        if (t == typeof(int))
            return (T)(object)int.Parse(g);
        if (t == typeof(long))
            return (T)(object)long.Parse(g);
        if (t == typeof(string))
            return (T)(object)g;
        if (t == typeof(char))
            return (T)(object)char.Parse(g);
        if (t == typeof(double))
            return (T)(object)double.Parse(g);
        if (t == typeof(bool))
            return (T)(object)bool.Parse(g);
        return default(T);
    }
    public static string[] Make<T1, T2>(out T1 v1, out T2 v2)
    {
        var r = read.Trim().Split(' ');
        v1 = getValue<T1>(r[0]);
        v2 = getValue<T2>(r[1]);
        return r;
    }
    public static string[] Make<T1, T2, T3>(out T1 v1, out T2 v2, out T3 v3)
    {
        var r = Make(out v1, out v2);
        v3 = getValue<T3>(r[2]);
        return r;
    }
    public static string[] Make<T1,T2,T3,T4>(out T1 v1,out T2 v2,out T3 v3,out T4 v4)
    {
        var r = Make(out v1, out v2, out v3);
        v4 = getValue<T4>(r[3]);
        return r;
    }
    public static string[] Make<T1,T2,T3,T4,T5>(out T1 v1,out T2 v2,out T3 v3,out T4 v4,out T5 v5)
    {
        var r = Make(out v1, out v2, out v3, out v4);
        v5 = getValue<T5>(r[4]);
        return r;
    }
    public const long Inf = (long)1e18;
    public const double eps = 1e-6;
    public const string Alfa = "abcdefghijklmnopqrstuvwxyz";
    public const int MOD = 1000000007;
}

public class SegmentTree<T>
{
    private readonly T[] item;
    private readonly int _num;
    private readonly Func<T, T, T> _func;
    private readonly Func<T, T, T> updateFunc;
    private readonly T _init;

    private int Parent(int index)
        => (index - 1) >> 1;
    private int Left(int index)
        => (index << 1) + 1;
    private int Right(int index)
        => (index + 1) << 1;
    public T this[int i]
    {
        get { return item[i + _num - 1]; }
        set { item[i + _num - 1] = value; }
    }

    public SegmentTree(int num, T init, Func<T, T, T> func, Func<T, T, T> updateFunc = null)
    {
        _func = func;
        _num = 1;
        _init = init;
        this.updateFunc = updateFunc ?? ((T val1, T val2) => val2);
        while (_num <= num)
            _num *= 2;
        item = new T[2 * _num - 1];
        for (var i = 0; i < 2 * _num - 1; i++)
            item[i] = init;
    }
    public void Update(int index, T value)
    {
        index += _num - 1;
        item[index] = updateFunc(item[index], value);
        while (index > 0)
        {
            index = Parent(index);
            item[index] = _func(item[Left(index)], item[Right(index)]);
        }
    }
    public void Update(int left, int right, T value)
        => Update(left, right, 0, 0, _num, value);
    private void Update(int left, int right, int k, int l, int r, T value)
    {
        if (r <= left || right <= l) return;
        if (left <= l && r <= right) item[k] = updateFunc(item[k], value);
        else
        {
            Update(left, right, Left(k), l, (l + r) >> 1, value);
            Update(left, right, Right(k), (l + r) >> 1, r, value);
        }
    }
    public void All_Update()
    {
        for (int i = _num - 2; i >= 0; i--)
            item[i] = _func(item[Left(i)], item[Right(i)]);
    }
    public T Query(int index)
    {
        index += _num - 1;
        var value = _func(_init, item[index]);
        while (index > 0)
        {
            index = Parent(index);
            value = _func(value, item[index]);
        }
        return value;
    }
    //[left,right)
    public T Query(int left, int right)
        => Query(left, right, 0, 0, _num);
    private T Query(int left, int right, int k, int l, int r)
    {
        if (r <= left || right <= l) return _init;
        if (left <= l && r <= right) return item[k];
        else
            return _func(Query(left, right, Left(k), l, (l + r) >> 1), Query(left, right, Right(k), (l + r) >> 1, r));
    }
}