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++14 (Clang 3.8.0) (judge verdict: Accepted)

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=200015;
int k;
int c[N],n;
int b[N];
struct data{
	long long val; int num;
}sum[N];
inline bool cmp(data a,data b){
	return a.val<b.val||(a.val==b.val&&a.num<b.num);
}
inline int lowbit(int x){
	return x&(-x);
}
inline void change(int i){
	int j=i;
	while (j<=n){
		c[j]++;
		j+=lowbit(j);
	}
}
inline int getsum(int i){
	int zs=0; int j=i;
	while (j){
		zs+=c[j]; //out<<j<<endl;
		j-=lowbit(j);
	}
	return zs;
}
inline int read()//读入一个正数 
{
	int a=0;char ch=getchar();
	while(ch<'0'||ch>'9')ch=getchar();
	a=a*10+ch-'0';
	ch=getchar();
	while(ch>='0'&&ch<='9')
	{
		a=a*10+ch-'0';
		ch=getchar();
	}
	return a;
}
inline long long check(int x){
	for(int i=1;i<=n;i++)b[i]=read()-x;
	for(int i=1;i<=n;i++){sum[i].val=sum[i-1].val+b[i];sum[i].num=i;c[i]=0;}
	sort(&sum[1],&sum[n+1],cmp);
	long long zs=0;
	for(int i=1;i<=n;i++){
		if(sum[i].val>=0)zs++; 
		zs+=getsum(sum[i].num);//cout<<zs<<endl;
		change(sum[i].num);
	}
	return zs;
}
int main(){
	scanf("%d%d",&n,&k); 
	cout<<check(k)<<endl;
}