#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cassert>
#include<iostream>
#include<sstream>
#include<string>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<utility>
#include<numeric>
#include<algorithm>
#include<bitset>
#include<complex>
#include<stack>

using namespace std;

typedef long long Int;
typedef vector<int> vint;
typedef pair<int,int> pint;
typedef vector<string> vstring;
typedef vector<pint> vpint;

struct Edge{int to,from,cost;};

#ifdef DEBUG
#define debug cout
#else
stringstream __ss__;
#define debug __ss__
#endif

template<class T> void pv(T a, T b) { for (T i = a; i != b; ++i) debug << *i << " "; debug << endl; }
template<class T> void chmin(T &t, T f) { if (t > f) t = f; }
template<class T> void chmax(T &t, T f) { if (t < f) t = f; }
int in() { int x; scanf("%d", &x); return x; }

#define rep(i,n) for(int i=0;i<(n);++i)
#define repd(i,n) for(int i=(n)-1;i>=0;--i)
#define repn(i,m,n) for(int i=(m);i<=(n);++i)
#define repnd(i,m,n) for(int i=(n);i>=(m);--i)
#define rep0(i,n) for(i=0;i<(n);++i)
#define repd0(i,n) for(i=(n)-1;i>=0;--i)
#define repn0(i,m,n) for(i=(m);i<=(n);++i)
#define repnd0(i,m,n) for(i=(n);i>=(m);--i)
#define all(n) n.begin(),n.end()
#define sz(n) ((int)(n).size())
#define IL for(;;)
#define MP make_pair
#define PB push_back
#define SS stringstream
#define X second
#define Y first
#define PUTLINE debug<<"LINE:"<<__LINE__<<endl;

const int INF = 2147483647/3;
const double EPS = 1e-10;
const double PI = acos(-1.0);

const int dx[]={1,-1,0,0,1,-1,1,-1,0};
const int dy[]={0,0,1,-1,1,-1,-1,1,0};

int r[20010];

int f(int s,int a,int b){
	if(a>=b-1)return a;
	int m=(a+b)/2;
	if(r[m]<=s)return f(s,a,m);
	return f(s,m,b);
}

int main() {
	int n,s,res;
	IL{
		res=0;
		cin>>n>>s;
		if(n==0&&s==0)break;
		rep(i,n)r[i]=-in();
		sort(r,r+n);
		rep(i,n)r[i]=-r[i];
//rep(i,n)debug<<r[i]<<" ";
//debug<<endl;
		rep(i,n){
			if(r[0]+r[i]<=s)continue;
			res+=f(s-r[i],0,n)+1;
			if(r[i]+r[i]>s)--res;
//debug<<i<<" "<<res<<endl;
		}
		cout<<res/2<<endl;
	}
	return 0;
}
### Prompt

Create a solution in Cpp for the following problem:

There are n wizards. They are numbered from 1 to n, and the i-th wizard has the magical power ri (1 ≤ i ≤ n). Now they are confronting a powerful wizard, whose enemy's magical power is S. n Wizards are good at fighting together, especially two people. When two wizards cooperate, the magical power is simply the sum, and you can use powerful magic to beat enemies that are strong to some extent. Your job is to output the total number of wizard pairs (i, j) (i ≠ j and 1 ≤ i ≤ n and 1 ≤ j ≤ n) that can win against enemies with magical power S. However, (i, j) and (j, i) are counted as the same pair. When one magical power is greater than the other, the side with the greater magical power wins. If they are equal, it does not mean that they have won by trade-off.

Constraints

* All inputs are integers
* 1 ≤ n ≤ 20,000
* 1 ≤ ri ≤ 100 (1 ≤ i ≤ n)
* 1 ≤ S ≤ 100
* The number of test cases does not exceed 100.

Input

The input consists of multiple test cases. Each test case follows the format below.


n S
r1
r2
...
rn


The meaning of each variable is as in the problem statement. The end of the input is indicated by a line where two 0s are separated by a single space.

Output

Output the total number of pairs (i, j) (i ≠ j) that satisfy the conditions on one line for each case.

Example

Input

3 7
1
3
10
0 0


Output

2

### Response

```cpp
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cassert>
#include<iostream>
#include<sstream>
#include<string>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<utility>
#include<numeric>
#include<algorithm>
#include<bitset>
#include<complex>
#include<stack>

using namespace std;

typedef long long Int;
typedef vector<int> vint;
typedef pair<int,int> pint;
typedef vector<string> vstring;
typedef vector<pint> vpint;

struct Edge{int to,from,cost;};

#ifdef DEBUG
#define debug cout
#else
stringstream __ss__;
#define debug __ss__
#endif

template<class T> void pv(T a, T b) { for (T i = a; i != b; ++i) debug << *i << " "; debug << endl; }
template<class T> void chmin(T &t, T f) { if (t > f) t = f; }
template<class T> void chmax(T &t, T f) { if (t < f) t = f; }
int in() { int x; scanf("%d", &x); return x; }

#define rep(i,n) for(int i=0;i<(n);++i)
#define repd(i,n) for(int i=(n)-1;i>=0;--i)
#define repn(i,m,n) for(int i=(m);i<=(n);++i)
#define repnd(i,m,n) for(int i=(n);i>=(m);--i)
#define rep0(i,n) for(i=0;i<(n);++i)
#define repd0(i,n) for(i=(n)-1;i>=0;--i)
#define repn0(i,m,n) for(i=(m);i<=(n);++i)
#define repnd0(i,m,n) for(i=(n);i>=(m);--i)
#define all(n) n.begin(),n.end()
#define sz(n) ((int)(n).size())
#define IL for(;;)
#define MP make_pair
#define PB push_back
#define SS stringstream
#define X second
#define Y first
#define PUTLINE debug<<"LINE:"<<__LINE__<<endl;

const int INF = 2147483647/3;
const double EPS = 1e-10;
const double PI = acos(-1.0);

const int dx[]={1,-1,0,0,1,-1,1,-1,0};
const int dy[]={0,0,1,-1,1,-1,-1,1,0};

int r[20010];

int f(int s,int a,int b){
	if(a>=b-1)return a;
	int m=(a+b)/2;
	if(r[m]<=s)return f(s,a,m);
	return f(s,m,b);
}

int main() {
	int n,s,res;
	IL{
		res=0;
		cin>>n>>s;
		if(n==0&&s==0)break;
		rep(i,n)r[i]=-in();
		sort(r,r+n);
		rep(i,n)r[i]=-r[i];
//rep(i,n)debug<<r[i]<<" ";
//debug<<endl;
		rep(i,n){
			if(r[0]+r[i]<=s)continue;
			res+=f(s-r[i],0,n)+1;
			if(r[i]+r[i]>s)--res;
//debug<<i<<" "<<res<<endl;
		}
		cout<<res/2<<endl;
	}
	return 0;
}
```