Problem:
Score : 500 points

Problem Statement

There are N cards. The i-th card has an integer A_i written on it.
For any two cards, the integers on those cards are different.

Using these cards, Takahashi and Aoki will play the following game:

Aoki chooses an integer x.

Starting from Takahashi, the two players alternately take a card. The card should be chosen in the following manner:

Takahashi should take the card with the largest integer among the remaining card.

Aoki should take the card with the integer closest to x among the remaining card. If there are multiple such cards, he should take the card with the smallest integer among those cards.

The game ends when there is no card remaining.

You are given Q candidates for the value of x: X_1, X_2, ..., X_Q.
For each i (1 \leq i \leq Q), find the sum of the integers written on the cards that Takahashi will take if Aoki chooses x = X_i.

Constraints

2 \leq N \leq 100 000

1 \leq Q \leq 100 000

1 \leq A_1 < A_2 < ... < A_N \leq 10^9

1 \leq X_i \leq 10^9 (1 \leq i \leq Q)

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N Q
A_1 A_2 ... A_N
X_1
X_2
:
X_Q

Output

Print Q lines. The i-th line (1 \leq i \leq Q) should contain the answer for x = X_i.

Sample Input 1

5 5
3 5 7 11 13
1
4
9
10
13

Sample Output 1

31
31
27
23
23

For example, when x = X_3(= 9), the game proceeds as follows:

Takahashi takes the card with 13.

Aoki takes the card with 7.

Takahashi takes the card with 11.

Aoki takes the card with 5.

Takahashi takes the card with 3.

Thus, 13 + 11 + 3 = 27 should be printed on the third line.

Sample Input 2

4 3
10 20 30 40
2
34
34

Sample Output 2

70
60
60

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text;
using System.Numerics;
using static System.Math;
using static System.Array;
using static AtCoder.IO_ShortCut;
using static AtCoder.Tool;
using static AtCoder.ModInt;
namespace AtCoder
{
    class AC
    {
        const int MOD = 1000000007;
        //const int MOD = 998244353;
        const int INF = int.MaxValue / 2;
        const long SINF = long.MaxValue / 2;
        const double EPS = 1e-8;
        static readonly int[] dI = { 0, 1, 0, -1, 1, -1, -1, 1 };
        static readonly int[] dJ = { 1, 0, -1, 0, 1, 1, -1, -1 };
        //static List<List<int>> G = new List<List<int>>();
        static List<List<Edge>> G = new List<List<Edge>>();
        //static List<Edge> E = new List<Edge>();
        static void Main(string[] args)
        {
            var sw = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false };Console.SetOut(sw);
            Solve();
            Console.Out.Flush();
        }
        static void Solve()
        {
            int N, Q;
            Input(out N, out Q);
            var A = _ReadSplitInt;
            var sum = new long[N + 1];
            var tp = new long[N + 1];
            sum[0] = 0;
            tp[0] = 0;
            for(var i = 0; i < N; i++)
            {
                sum[i + 1] = sum[i] + A[i];
                tp[i + 1] = tp[i] + ((N + i) % 2 == 1 ? A[i] : 0);
            }
            
            for (var _ = 0; _ < Q; _++)
            {
                int x = Int;
                int l = 0;
                int r = (N + 1) / 2 + 1;
                while (r - l > 1)
                {
                    int mid = (l + r) / 2;
                    var dif = A[N - mid] - x;
                    if (dif < 0) { r = mid;continue; }

                    int L = -1;
                    int R = N;
                    while (R - L > 1)
                    {
                        var MID = (L + R) / 2;
                        if (A[MID] > x + dif) { R = MID; }
                        else L = MID;
                    }
                    var up = L;

                    L = -1;R = N;
                    while (R - L > 1)
                    {
                        var MID = (L + R) / 2;
                        if (A[MID] >= x - dif) { R = MID; }
                        else L = MID;
                    }
                    var dn = L;

                    long num = up - dn;
                    if (num >= mid) l = mid;
                    else r = mid;
                }
                //OutL($"l={l}");
                OutL($"{tp[Max(0, N - 2 * l)] + sum[N] - sum[N - l]}");
            }
        }

        public struct Edge
        {
            public int from;

            public int to;
            public long dist;
            
            public Edge(int t, long c)
            {
                from = -1;
                to = t;
                dist = c;
            }
            public Edge(int f, int t, long c)
            {
                from = f;
                to = t;
                dist = c;
            }
        }
    }
    public class SegmentTree<T>
    {
        int n;
        T[] Tree;
        Func<T, T, T> f;
        T ex;
        public SegmentTree(int size, Func<T, T, T> fun, T exvalue)
        {
            f = fun;
            ex = exvalue;
            n = 1;
            while (n < size) n <<= 1;
            Tree = new T[(n << 1) - 1];
            for (var i = 0; i < Tree.Length; i++) Tree[i] = ex;
        }
        public SegmentTree(int size, Func<T, T, T> f, T exvalue, T initial) : this(size, f, exvalue)
        {
            for (var i = 0; i < size; i++) Tree[i + n - 1] = initial;
            Set_All();
        }

        public void Set_All()
        {
            for (var i = n - 2; i >= 0; i--)
            {
                Tree[i] = f(Tree[(i << 1) + 1], Tree[(i << 1) + 2]);
            }
        }

        public void Assign(int ind, T val)
        {
            Tree[ind + n - 1] = val;
        }
        public void Update(int ind)
        {
            int i = ind + n - 1;
            while (i > 0)
            {
                i = (i - 1) >> 1;
                Tree[i] = f(Tree[(i << 1) + 1], Tree[(i << 1) + 2]);
            }
        }

        public void Query_Update(int ind, T val)
        {
            Assign(ind, val);
            Update(ind);
        }
        public T Query_Answer(int l, int r) //[l,r)
        {
            return Scanning(l, r, 0, 0, n);
        }
        private T Scanning(int l, int r, int ind, int ind_l, int ind_r)
        {
            if (ind_r <= l || r <= ind_l) { return ex; }
            if (l <= ind_l && ind_r <= r) { return Tree[ind]; }
            return f(Scanning(l, r, (ind << 1) + 1, ind_l, (ind_l + ind_r) >> 1), Scanning(l, r, (ind << 1) + 2, (ind_l + ind_r) >> 1, ind_r));
        }

        public T Look(int ind)
        {
            return Tree[ind + n - 1];
        }
        public void Debug_Display_All()
        {
            for (var i = 0; i < n; i++) Console.Write($"{Tree[i + n - 1]} ");
            Console.WriteLine();
        }
    }
    struct ModInt
    {
        public long value;
        private const int MOD = 1000000007;
        //private const int MOD = 998244353;

        public ModInt(long value) { this.value = value; }
        public static implicit operator ModInt(long a)
        {
            var ret = a % MOD;
            return new ModInt(ret < 0 ? (ret + MOD) : ret);
        }
        public static ModInt operator +(ModInt a, ModInt b) => (a.value + b.value);
        public static ModInt operator -(ModInt a, ModInt b) => (a.value - b.value);
        public static ModInt operator *(ModInt a, ModInt b) => (a.value * b.value);
        public static ModInt operator /(ModInt a, ModInt b) => a * Modpow(b, MOD - 2);
        public static ModInt operator <<(ModInt a, int n) => (a.value << n);
        public static ModInt operator >>(ModInt a, int n) => (a.value >> n);
        public static ModInt operator ++(ModInt a) => a.value + 1;
        public static ModInt operator --(ModInt a) => a.value - 1;
        public static ModInt Modpow(ModInt a, long n)
        {
            var k = a;
            ModInt ret = 1;
            while (n > 0)
            {
                if ((n & 1) != 0) ret *= k;
                k *= k;
                n >>= 1;
            }
            return ret;
        }
        private static readonly List<long> Factorials = new List<long>() { 1 };
        public static ModInt Fac(long n)
        {
            for (var i = Factorials.Count(); i <= n; i++)
            {
                Factorials.Add((Factorials[i - 1] * i) % MOD);
            }
            return Factorials[(int)n];
        }
        public static ModInt nCr(long n, long r)
        {
            return n < r ? 0 : Fac(n) / (Fac(r) * Fac(n - r));
        }
        public static explicit operator int(ModInt a) => (int)a.value;
    }
    static class IO_ShortCut
    {
        public static string[] _ReadSplit => Console.ReadLine().Split();
        public static int[] _ReadSplitInt => ConvertAll(Console.ReadLine().Split(), int.Parse);
        public static long[] _ReadSplitLong => ConvertAll(Console.ReadLine().Split(), long.Parse);
        public static double[] _ReadSplit_Double => ConvertAll(Console.ReadLine().Split(), double.Parse);
        public static string Str => Console.ReadLine();
        public static int Int => int.Parse(Console.ReadLine());
        public static long Long => long.Parse(Console.ReadLine());
        public static double Double => double.Parse(Console.ReadLine());
        public static T Conv<T>(string input)
        {
            if (typeof(T).Equals(typeof(ModInt)))
            {
                return (T)(dynamic)(long.Parse(input));
            }
            return (T)Convert.ChangeType(input, typeof(T));
        }
        public static void Input<T>(out T a) => a = Conv<T>(Console.ReadLine());
        public static void Input<T, U>(out T a, out U b)
        { var q = _ReadSplit;a = Conv<T>(q[0]);b = Conv<U>(q[1]); }
        public static void Input<T, U, V>(out T a, out U b, out V c)
        { var q = _ReadSplit;a = Conv<T>(q[0]);b = Conv<U>(q[1]);c = Conv<V>(q[2]); }
        public static void Input<T, U, V, W>(out T a, out U b, out V c, out W d)
        { var q = _ReadSplit; a = Conv<T>(q[0]); b = Conv<U>(q[1]); c = Conv<V>(q[2]);d = Conv<W>(q[3]); }

        public static void OutL(object s) => Console.WriteLine(s);
        public static void Out_Sep<T>(IEnumerable<T> s) => Console.WriteLine(string.Join(" ", s));
        public static void Out_Sep<T>(IEnumerable<T> s, string sep) => Console.WriteLine(string.Join($"{sep}", s));
        public static void Out_Sep(params object[] s) => Console.WriteLine(string.Join(" ", s));
        public static void Out_One(object s) => Console.Write($"{s} ");
        public static void Out_One(object s, string sep) => Console.Write($"{s}{sep}");
        public static void Endl() => Console.WriteLine();
    }
    public static class Tool
    {
        static public void Initialize<T>(ref T[] array, T initialvalue)
        {
            array = ConvertAll(array, x => initialvalue);
        }
        static public void Swap<T>(ref T a, ref T b)
        {
            T keep = a;
            a = b;
            b = keep;
        }
        static public void Display<T>(T[,] array2d, int n, int m)
        {
            for (var i = 0; i < n; i++)
            {
                for (var j = 0; j < m; j++)
                {
                    Console.Write($"{array2d[i, j]} ");
                }
                Console.WriteLine();
            }
        }
        static public long LPow(int a, int b) => (long)Pow(a, b);
        static public bool Bit(long x, int dig) => ((1L << dig) & x) != 0;
        static public int Sig(long a) => a == 0 ? 0 : (int)(a / Abs(a));
    }
}