Problem:
Score : 500 points

Problem Statement

Takahashi has come to a party as a special guest.
There are N ordinary guests at the party. The i-th ordinary guest has a power of A_i.

Takahashi has decided to perform M handshakes to increase the happiness of the party (let the current happiness be 0).
A handshake will be performed as follows:

Takahashi chooses one (ordinary) guest x for his left hand and another guest y for his right hand (x and y can be the same).

Then, he shakes the left hand of Guest x and the right hand of Guest y simultaneously to increase the happiness by A_x+A_y.

However, Takahashi should not perform the same handshake more than once. Formally, the following condition must hold:

Assume that, in the k-th handshake, Takahashi shakes the left hand of Guest x_k and the right hand of Guest y_k. Then, there is no pair p, q (1 \leq p < q \leq M) such that (x_p,y_p)=(x_q,y_q).

What is the maximum possible happiness after M handshakes?

Constraints

1 \leq N \leq 10^5

1 \leq M \leq N^2

1 \leq A_i \leq 10^5

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N M
A_1 A_2 ... A_N

Output

Print the maximum possible happiness after M handshakes.

Sample Input 1

5 3
10 14 19 34 33

Sample Output 1

202

Let us say that Takahashi performs the following handshakes:

In the first handshake, Takahashi shakes the left hand of Guest 4 and the right hand of Guest 4.

In the second handshake, Takahashi shakes the left hand of Guest 4 and the right hand of Guest 5.

In the third handshake, Takahashi shakes the left hand of Guest 5 and the right hand of Guest 4.

Then, we will have the happiness of (34+34)+(34+33)+(33+34)=202.

We cannot achieve the happiness of 203 or greater, so the answer is 202.

Sample Input 2

9 14
1 3 5 110 24 21 34 5 3

Sample Output 2

1837

Sample Input 3

9 73
67597 52981 5828 66249 75177 64141 40773 79105 16076

Sample Output 3

8128170

Solution in Rust (1.15.1) (judge verdict: Accepted)

use std::io::Write;

#[allow(unused)]
macro_rules! debug {
    ($($format:tt)*) => (write!(std::io::stderr(), $($format)*).unwrap());
}
#[allow(unused)]
macro_rules! debugln {
    ($($format:tt)*) => (writeln!(std::io::stderr(), $($format)*).unwrap());
}

const A_MAX: usize = 100_000;

fn main() {
    let (n, m): (usize, usize) = {
        let mut s = String::new();
        std::io::stdin().read_line(&mut s).unwrap();
        let s = s.trim_right().to_owned();
        let mut ws = s.split_whitespace();
        let a = ws.next().unwrap().parse().unwrap();
        let b = ws.next().unwrap().parse().unwrap();
        (a, b)
    };

    let mut a: Vec<usize> = {
        let mut s = String::new();
        std::io::stdin().read_line(&mut s).unwrap();
        let s = s.trim_right().to_owned();
        s.split_whitespace().map(|x| x.parse().unwrap()).collect()
    };

    // b[k] = (a[j] >= kとなるjの個数)
    let mut b = vec![];
    let mut sorted_a = a.clone();
    sorted_a.sort();
    // debugln!("{:?}", sorted_a);
    let mut i = 0;
    for k in 0..(2 * A_MAX + 1) {
        while i < n && sorted_a[i] < k {
            i += 1;
        }
        b.push(n - i);
    }
    // debugln!("{:?}", b);
    // debugln!("b: {:?}", &b[0..20]);
    // debugln!("{}", b[9]);
    // debugln!("{}", b[10]);
    // debugln!("{}", b[11]);

    a.sort_by(|x, y| y.cmp(x));

    // f(k) >=m, f(k + 1) < mとなるkを探す
    let k = if f(A_MAX * 2, &a, &b) >= m {
        A_MAX * 2
    } else {
        let mut left = 0;
        let mut right = A_MAX * 2;
        while left + 1 < right {
            let mid = (left + right) / 2;

            if f(mid, &a, &b) >= m {
                left = mid;
            } else {
                right = mid;
            }
        }
        left
    };
    // debugln!("k: {}", k);
    // debugln!("f(k): {}", f(k, &a, &b));

    // f(k + 1)までの実際の和を求める
    // debugln!("b[x]: {}", b[109]);
    let mut cumsum = vec![];
    cumsum.push(0);
    for i in 0..n {
        let cumsum_i = cumsum[i] + a[i];
        cumsum.push(cumsum_i);
    }
    // debugln!("cumsum: {:?}", cumsum);
    let mut sum_k = 0;
    for a_i in &a {
        // debugln!("a[i]: {}", a_i);
        // debugln!("b[k + 1 - a_i]: {}", b[k + 1 - a_i]);
        // debugln!("cumsum[b[...]]: {}", cumsum[b[k + 1 - a_i]]);
        let x = b[k.saturating_sub(*a_i)];
        sum_k += cumsum[x] + a_i * x;
    }
    // debugln!("f(k + 1): {}", f(k + 1, &a, &b));
    // debugln!("sum k+1: {:?}", sum_kpls1);

    let ans = sum_k - (f(k, &a, &b) - m) * k;
    println!("{}", ans);
}

// a[i] + a[j] >= kとなる(i, j)の個数
fn f(k: usize, a: &Vec<usize>, b: &Vec<usize>) -> usize {
    let n = a.len();

    let mut ret = 0;
    for i in 0..n {
        ret += b[k.saturating_sub(a[i])];
    }
    ret
}