Problem:
Problem B: Spellcasters

n 人の魔法使いがいる。彼らには 1 から n までの番号があり、i 番目の魔法使いは魔力 ri ( 1 ≤ i ≤ n ) を持っている。いま彼らは強力な魔法使いと対峙しており、その敵の魔力は S である。n 人の魔法使いは協力して戦うのが得意で、特に 2 人で協力して戦うことを好む。2 人の魔法使いが協力した場合、魔力は単純にその和となり、強力な魔法などを駆使してある程度強い敵にも勝てるようになる。あなたの仕事は魔力 S を持つ敵に対して勝つことができる魔法使いのペア (i, j) ( i ≠ j かつ 1 ≤ i ≤ n かつ 1 ≤ j ≤ n ) の総数を出力することである。ただし (i, j) と (j, i) は同じ組として数える。一方の魔力が他方の魔力よりも大きいとき、大きい魔力を持っている側が勝つ。等しい場合は相打ちで勝ったことにならない。

Input

入力は複数のテストケースからなる。 各テストケースは以下の形式に従う。

n S
r1
r2
…
rn

各変数の意味は問題文中の通りである。
入力の終わりは、ふたつの0が一文字の空白で区切られる一行で示される。

Constraints

入力はすべて整数

1 ≤ n ≤ 20,000

1 ≤ ri ≤ 100 ( 1 ≤ i ≤ n )

1 ≤ S ≤ 100

テストケースの数は 100 を超えない。

Output

条件を満たす組 (i, j) (i ≠ j) の総数を各ケースに付き 1 行に出力せよ。

Sample Input

3 7
1
3
10
0 0

Sample Output

2

Solution in JAVA (judge verdict: Accepted)

import java.util.*;
public class Main{
    public static void main(String[] args){
	new Main().run();
    }
    Scanner sc = new Scanner(System.in);

    int n, S, ans;
    int[] magic;

    void run(){
	while(sc.hasNext()){
	    n = sc.nextInt();
	    S = sc.nextInt();
	    if(n==0 && S==0) break;
	    magic = new int[n];
	    for(int i=0; i<n; i++)
		magic[i] = sc.nextInt();
	    ans = 0;
	    solve();
	    System.out.println(ans);
	}
    }

    void solve(){
	Arrays.sort(magic);
	for(int i=n-1; i>=0; i--){
	    if(magic[i]>=S) ans += i;
	    else if(magic[i]<S/2) break;
	    else if(i>0){
		ans += search(0, i-1, i);
	    }
	    //System.out.println(i+" "+ans);
	}
    }
    
    int search(int left, int right, int x){
	int mid = (left+right)/2;
	while(left<=right){
	    if(magic[mid]+magic[x] > S) right = mid-1;
	    else left = mid+1;
	    mid = (left+right)/2;
	}
	if(magic[left]+magic[x]<=S) return 0;
	return x-left;
    }
}