Problem:
Score : 400 points

Problem Statement

You are given N integers; the i-th of them is A_i.
Find the maximum possible sum of the absolute differences between the adjacent elements after arranging these integers in a row in any order you like.

Constraints

2 \leq N \leq 10^5

1 \leq A_i \leq 10^9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1
:
A_N

Output

Print the maximum possible sum of the absolute differences between the adjacent elements after arranging the given integers in a row in any order you like.

Sample Input 1

5
6
8
1
2
3

Sample Output 1

21

When the integers are arranged as 3,8,1,6,2, the sum of the absolute differences between the adjacent elements is |3 - 8| + |8 - 1| + |1 - 6| + |6 - 2| = 21. This is the maximum possible sum.

Sample Input 2

6
3
1
4
1
5
9

Sample Output 2

25

Sample Input 3

3
5
5
1

Sample Output 3

8

Solution in Pascal (FPC 2.6.2) (judge verdict: Runtime Error)

var
	a:array[-10..200010] of int64;
	n,i,l,r:longint;
	s,t,t1,t2,x,y:int64;
procedure qsort(l1,r1:longint);
var
	t,mid:int64;
	i,j:longint;
begin
	i:=l; j:=r; mid:=a[(l1+r1) div 2];
	repeat
		while a[i]<mid do inc(i);
		while a[j]>mid do dec(j);
		if i<=j then
		begin
			t:=a[i]; a[i]:=a[j]; a[j]:=t;
			inc(i); dec(j);
		end;
	until i>j;
	if l1<j then qsort(l1,j);
	if i<r1 then qsort(i,r1);
end;
procedure left;
begin
	t2:=a[l];
	inc(l);
end;
procedure right;
begin
	t2:=a[r];
	dec(r);
end;
begin
	read(n);
	for i:=1 to n do read(a[i]);
	qsort(1,n);
	s:=0; 
	t1:=a[(1+n) div 2];
	l:=1; r:=n;
	for i:=1 to n-1 do
	begin
		x:=abs(a[r]-t1);
		y:=abs(t1-a[l]);
		if x>y then right;
		if x<y then left;
		if x=y then
			if abs(a[r-1]-a[l])>abs(a[r]-a[l+1]) then right
			else left;
		s:=s+abs(t1-t2);
		t1:=t2;
	end;
	t:=0;
	t1:=a[(1+n) div 2+1];
	l:=1; r:=n;
	for i:=1 to n-1 do
	begin
		x:=abs(a[r]-t1);
		y:=abs(t1-a[l]);
		if x>y then right;
		if x<y then left;
		if x=y then
			if abs(a[r-1]-a[l])>abs(a[r]-a[l+1]) then right
			else left;
		t:=t+abs(t1-t2);
		t1:=t2;
	end;
	if s>t then writeln(s)
	else writeln(t);
end.