Problem:
Score : 300 points

Problem Statement

Given are an integer X and an integer sequence of length N: p_1, \ldots, p_N.

Among the integers not contained in the sequence p_1, \ldots, p_N (not necessarily positive), find the integer nearest to X, that is, find the integer whose absolute difference with X is the minimum. If there are multiple such integers, report the smallest such integer.

Constraints

1 \leq X \leq 100

0 \leq N \leq 100

1 \leq p_i \leq 100

p_1, \ldots, p_N are all distinct.

All values in input are integers.

Input

Input is given from Standard Input in the following format:

X N
p_1 ... p_N

Output

Print the answer.

Sample Input 1

6 5
4 7 10 6 5

Sample Output 1

8

Among the integers not contained in the sequence 4, 7, 10, 6, 5, the one nearest to 6 is 8.

Sample Input 2

10 5
4 7 10 6 5

Sample Output 2

9

Among the integers not contained in the sequence 4, 7, 10, 6, 5, the ones nearest to 10 are 9 and 11. We should print the smaller one, 9.

Sample Input 3

100 0

Sample Output 3

100

When N = 0, the second line in the input will be empty. Also, as seen here, X itself can be the answer.

Solution in Go (1.14.1) (judge verdict: Accepted)

package main

import (
	"bufio"
	"fmt"
	"log"
	"math"
	"os"
	"sort"
	"strconv"
)

func main() {
	x := readInt()
	n := readInt()
	p := readIntSlice(n)

	if n == 0 {
		fmt.Println(x)
		return
	}

	sort.Ints(p)

	result := contain(p, x)

	if result == -1 {
		fmt.Println(x)
		return
	}

	bestPlus := 0
	for i := 1; i < len(p)-result; i++ {
		if p[result]+i < p[result+i] {
			bestPlus = p[result] + i
			break
		}
	}
	if bestPlus == 0 {
		bestPlus = p[len(p)-1] + 1
	}

	//マイナス方向
	bestMinus := 0
	for i := 1; i < result; i++ {
		if p[result]-i > p[result-i] {
			bestMinus = p[result] - i
			break
		}
	}
	if bestMinus == 0 {
		bestMinus = p[0] - 1
	}

	if x == 1 {
		fmt.Println(0)
		return
	}
	if math.Abs(float64(x-bestMinus)) <= math.Abs(float64(bestPlus-x)) {
		fmt.Println(bestMinus)
		return
	} else {
		fmt.Println(bestPlus)
		return
	}

}

var (
	scanner *bufio.Scanner
)

func init() {
	scanner = bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
}

func readInt() int {
	var t string

	if scanner.Scan() {
		t = scanner.Text()
	}

	n, err := strconv.Atoi(t)
	if err != nil {
		log.Fatal(err)
	}

	return n

}

func readIntSlice(n int) []int {
	s := make([]int, n)
	var t string

	for i := 0; i < int(n); i++ {
		if scanner.Scan() {
			t = scanner.Text()
		}

		num, err := strconv.Atoi(t)
		if err != nil {
			log.Fatal(err)
		}
		s[i] = num
	}

	return s
}

func contain(p []int, x int) int {
	for i, v := range p {
		if v == x {
			return i
		}
	}
	return -1
}

func min(x, y int) int {
	if x < y {
		return x
	}
	return y
}