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 (GCC 5.4.1) (judge verdict: Accepted)

#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;
typedef long long ll;
const int MAXN = 200010;

int n, k, a[MAXN];

void input() {
	scanf( "%d%d", &n, &k );
	for( int i = 0; i < n; ++i )
		scanf( "%d", a+i ), a[i] -= k;
}

namespace Splay {
	struct Node {
		ll val;
		int sz;
		Node *ch[2], *pa, **rt;
		Node( ll v ) {
			val = v, sz = 1;
			ch[0] = ch[1] = pa = NULL;
			rt = NULL;
		}
		Node *maintain() {
			sz = 1;
			if( ch[0] ) sz += ch[0]->sz;
			if( ch[1] ) sz += ch[1]->sz;
			return this;
		}
		int rela() {
			return pa->ch[0] == this ? 0 : 1;
		}
		Node *rotate() {
			int x = rela();
			Node *old = pa;
			if( pa->pa ) pa->pa->ch[old->rela()] = this;
			pa = pa->pa;
			old->ch[x] = ch[x^1];
			if( ch[x^1] ) ch[x^1]->pa = old;
			ch[x^1] = old, old->pa = this;
			old->maintain(), maintain();
			if( !pa ) *rt = this;
			return this;
		}
		Node *splay( Node *tg = NULL ) {
			while( pa != tg ) {
				if( pa->pa == tg ) rotate();
				else {
					if( rela() == pa->rela() )
						pa->rotate(), rotate();
					else rotate(), rotate();
				}
			}
			return this;
		}
	};
	Node *rt = NULL;
	void insert( ll v ) {
		if( !rt ) {
			rt = new Node(v);
			rt->rt = &rt;
			return;
		}
		Node *o = rt;
		while(1) {
			int d = v <= o->val ? 0 : 1;
			if( !o->ch[d] ) {
				o->ch[d] = new Node(v);
				o->ch[d]->pa = o;
				o->ch[d]->rt = &rt;
				o->ch[d]->splay();
				return;
			} else {
				o = o->ch[d];
			}
		}
	}
	int query( ll v ) {
		int ans = 0;
		Node *o = rt;
		while( o ) {
			if( v <= o->val ) o = o->ch[0];
			else {
				++ans;
				ans += o->ch[0] ? o->ch[0]->sz : 0;
				o = o->ch[1];
			}
		}
		return rt->sz - ans;
	}
}

void solve() {
	ll zero = 0, ans = 0;
	for( int i = 0; i < n; ++i ) {
		zero -= a[i];
		Splay::insert( zero + a[i] );
		ans += Splay::query(zero);
		// printf( "%lld\n", ans );
	}
	printf( "%lld\n", ans );
}

int main() {
	input(), solve();
	return 0;
}