Problem:
Score : 200 points

Problem Statement

Given are integers a,b,c and d.
If x and y are integers and a \leq x \leq b and c\leq y \leq d hold, what is the maximum possible value of x \times y?

Constraints

-10^9 \leq a \leq b \leq 10^9

-10^9 \leq c \leq d \leq 10^9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

a b c d

Output

Print the answer.

Sample Input 1

1 2 1 1

Sample Output 1

2

If x = 1 and y = 1 then x \times y = 1.
If x = 2 and y = 1 then x \times y = 2.
Therefore, the answer is 2.

Sample Input 2

3 5 -4 -2

Sample Output 2

-6

The answer can be negative.

Sample Input 3

-1000000000 0 -1000000000 0

Sample Output 3

1000000000000000000

Solution in Kotlin (1.3.71) (judge verdict: Wrong Answer)

import java.lang.Math.abs

fun main(args: Array<String>) {
    val S = readLine()!!.toString();
    val array = S.split(" ")
    var a = array[0].toLong()
    var b = array[1].toLong()
    var c = array[2].toLong()
    var d = array[3].toLong()

//    a = BigDecimal.TEN.pow(9).toLong()
//    b = BigDecimal.TEN.pow(9).toLong()
//    c = BigDecimal.TEN.pow(9).toLong()
//    d = BigDecimal.TEN.pow(9).toLong()

    // 正負の場合分け
    val ab = a * b
    val cd = c * d

    var aMinus = false
    if (ab < 0) {
        // a < 0, 0 < b
        aMinus = true
    } else {
        // a , b < 0, 0 < a,b
    }
    if (b == 0L && a < 0) {
        aMinus = true
    }

    var cMinus = false
    if (cd < 0) {
        cMinus = true
    }
    if (d == 0L && c < 0) {
        cMinus = true
    }

    // a, c ともにマイナスのとき、
    if (aMinus && cMinus) {
        // ABS (a+c) と ABS (b+d)を比較して、大きな方のペアを採用する。
        val absAplusC = abs(a) + abs(c)
        val absBplusD = abs(b) + abs(d)

        if (b == 0L) {
            println(a * c)
            return
        }
        if (d == 0L) {
            println(a * c)
            return
        }

        if (absAplusC < absBplusD) {
            println(b * d)
        } else {
            println(a * c)
        }
        return
    }

    // (a,b)および(b,d)がともに、正のセットか、負のセットであるとき
    // 単純に、a*c vs a*d vs b*c vs b*d
    val ac = a * c
    val ad = a * d
    val bc = b * c
    val bd = b * d

    val ints = mutableListOf<Long>(ac, ad, bc, bd)
    ints.sort()
    println(ints)

    println(ints.last())
}