Problem:
Score : 400 points

Problem Statement

There are N integers, A_1, A_2, ..., A_N, arranged in a row in this order.

You can perform the following operation on this integer sequence any number of times:

Operation: Choose an integer i satisfying 1 \leq i \leq N-1. Multiply both A_i and A_{i+1} by -1.

Let B_1, B_2, ..., B_N be the integer sequence after your operations.

Find the maximum possible value of B_1 + B_2 + ... + B_N.

Constraints

All values in input are integers.

2 \leq N \leq 10^5

-10^9 \leq A_i \leq 10^9

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 ... A_N

Output

Print the maximum possible value of B_1 + B_2 + ... + B_N.

Sample Input 1

3
-10 5 -4

Sample Output 1

19

If we perform the operation as follows:

Choose 1 as i, which changes the sequence to 10, -5, -4.

Choose 2 as i, which changes the sequence to 10, 5, 4.

we have B_1 = 10, B_2 = 5, B_3 = 4. The sum here, B_1 + B_2 + B_3 = 10 + 5 + 4 = 19, is the maximum possible result.

Sample Input 2

5
10 -4 -8 -11 3

Sample Output 2

30

Sample Input 3

11
-1000000000 1000000000 -1000000000 1000000000 -1000000000 0 1000000000 -1000000000 1000000000 -1000000000 1000000000

Sample Output 3

10000000000

The output may not fit into a 32-bit integer type.

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

using System;
using System.Numerics;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace debug
{
    class main
    {
        static void Main(string[] args)
        {
            //問題クラスを展開
            ProgramD a = new ProgramD();
            a.main();//実行する

        }

    }

    class ProgramA
    {
        public void main()
        {
            //入力
            string[] s = Console.ReadLine().Split(' ');
            int a = int.Parse(s[0]);
            int b = int.Parse(s[1]);
            int t = int.Parse(s[2]);


            //b*(t/a)が答え
            Console.WriteLine(b * (t/a));

        }
    }

    class ProgramB
    {
        public void main()
        {

            //入力
            int n = int.Parse(Console.ReadLine());
            string[] v = Console.ReadLine().Split(' ');
            string[] c = Console.ReadLine().Split(' ');
            int sum = 0;


            //v-cをしてマイナスでなければ足す
            for (int i = 0; i < n; i++)
            {
                if (int.Parse(v[i]) - int.Parse(c[i]) > 0)
                    sum += int.Parse(v[i]) - int.Parse(c[i]);
            }

            //答え出力
            Console.WriteLine(sum);
            

        }
    }

    class ProgramC
    {
        public void main()
        {

            //入力
            int n = int.Parse(Console.ReadLine());
            long[] R = new long[n];
            long[] L = new long[n];

           

            string[] a = Console.ReadLine().Split(' ');
            L[0] = long.Parse(a[0]);
            R[0] = long.Parse(a[n - 1]);

            //左からのgcdと右からのgcdを求める
            for (int i = 1; i < n; i++)
            {
                L[i] = gcd(L[i - 1], long.Parse(a[i]));
                R[i] = gcd(R[i - 1], long.Parse(a[n - 1 - i]));
            }

            long max = 0;

            for (int i = 0; i < n; i++)
            {
                //それぞれの位置で引き出す
                long temp = 0;
                if (i == 0)//一番左は右n-1個分のみで考える
                    temp = R[n - 2];
                else if(i == n- 1)//一番右は左n-1個分のみで考える
                    temp = L[n - 2];
                else
                    temp = gcd(L[i - 1], R[n - 2 - i]);

                //最大を求める
                max = Math.Max(max, temp);
            }

            //答えを出力
            Console.WriteLine(max);

        }

        /*最大公約数を求める関数*/
        static long gcd(long p, long q)
        {
            if (p < q)
            {
                long temp = p;
                p = q;
                q = temp;
            }

            long r = 1;

            while (r != 0)
            {
                r = p % q;
                p = q;
                q = r;
            }

            return p;
        }

    }


    class ProgramD
    {
        public void main()
        {

            //入力
            int n = int.Parse(Console.ReadLine());
            string[] a = Console.ReadLine().Split(' ');

            long[] dp_u = new long[n];
            long[] dp_d = new long[n];

            dp_u[1] = -(long.Parse(a[0]) + long.Parse(a[1])); 
            dp_d[1] = long.Parse(a[0]) + long.Parse(a[1]);

            for (int i = 2; i < n; i++)
            {
                dp_u[i] = Math.Max(dp_u[i - 1] - long.Parse(a[i]) + 2 * long.Parse(a[i - 1]), dp_d[i - 1] - long.Parse(a[i]) - 2 *long.Parse(a[i - 1]));
                dp_d[i] = Math.Max(dp_u[i - 1] + long.Parse(a[i]), dp_d[i - 1] + long.Parse(a[i]));

            }


            //答を出す
            Console.WriteLine(Math.Max(dp_u[n -1], dp_d[n -1]));

        }

    }

    

}