Problem:
Score : 1200 points

Problem Statement

Let M be a positive integer.

You are given 2 N integers a_1, a_2, \ldots, a_{2 N}, where 0 \leq a_i < M for each i.

Consider dividing the 2 N integers into N pairs.
Here, each integer must belong to exactly one pair.

We define the ugliness of a pair (x, y) as (x + y) \mod M.
Let Z be the largest ugliness of the N pairs. Find the minimum possible value of Z.

Constraints

All values in input are integers.

1 \leq N \leq 10^5

1 \leq M \leq 10^9

0 \leq a_i < M

Input

Input is given from Standard Input in the following format:

N M
a_1 a_2 \cdots a_{2N}

Output

Print the minimum possible value of Z, where Z is the largest ugliness of the N pairs.

Sample Input 1

3 10
0 2 3 4 5 9

Sample Output 1

5

One solution is to form pairs (0, 5), (2, 3) and (4, 9), with ugliness 5, 5 and 3, respectively.

Sample Input 2

2 10
1 9 1 9

Sample Output 2

0

Pairs (1, 9) and (1, 9) should be formed, with ugliness both 0.

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <algorithm>  
#include <iostream>  
#include <sstream>  
#include <string>  
#include <cstring>
#include <vector>  
#include <queue>  
#include <set>  
#include <map>  
#include <cstdio>  
#include <cstdlib>  
#include <cctype>  
#include <cmath>  
#include <list>  
#include <cassert>
#include <ctime>
#include <climits>
using namespace std;  

#define PB push_back  
#define MP make_pair  
#define SZ(v) ((int)(v).size())  
#define FOR(i,a,b) for(int i=(a);i<(b);++i)  
#define REP(i,n) FOR(i,0,n)  
#define FORE(i,a,b) for(int i=(a);i<=(b);++i)  
#define REPE(i,n) FORE(i,0,n)  
#define FORSZ(i,a,v) FOR(i,a,SZ(v))  
#define REPSZ(i,v) REP(i,SZ(v))  
typedef long long ll;
typedef unsigned long long ull;
ll gcd(ll a,ll b) { return b==0?a:gcd(b,a%b); }

const int MAXN=100000;

int n,mod;
int a[2*MAXN];

int calc(int nleft) {
	assert(nleft%2==0);
	int lmx=0;
	REP(i,nleft/2) {
		int cur=a[i]+a[nleft-i-1];
		if(cur>=mod) return -1;
		lmx=max(lmx,cur);
	}
	int nright=2*n-nleft; assert(nright%2==0);
	int rmx=0;
	REP(i,nright/2) {
		int cur=a[nleft+i]+a[nleft+nright-i-1];
		if(cur<mod) return -2;
		rmx=max(rmx,cur-mod);
	}
	return max(lmx,rmx);
}

int solve() {
	sort(a,a+2*n);
	int ret=INT_MAX;
	{ int cur=calc(0); if(cur>=0) ret=min(ret,cur); }
	{ int cur=calc(2*n); if(cur>=0) ret=min(ret,cur); }
	int lo=1,hi=n-1;
	while(lo<=hi) {
		int mi=lo+(hi-lo)/2;
		int cur=calc(2*mi);
		if(cur==-1) { hi=mi-1; continue; }
		if(cur==-2) { lo=mi+1; continue; }
		ret=min(ret,cur); hi=mi-1;
	}
	return ret;
}

void run() {
	scanf("%d%d",&n,&mod);
	REP(i,2*n) scanf("%d",&a[i]);
	printf("%d\n",solve());
}

int main() {
	run();
	return 0;
}