Problem:
Score : 500 points

Problem Statement

Rng has a connected undirected graph with N vertices.
Currently, there are M edges in the graph, and the i-th edge connects Vertices A_i and B_i.

Rng will add new edges to the graph by repeating the following operation:

Operation: Choose u and v (u \neq v) such that Vertex v can be reached by traversing exactly three edges from Vertex u, and add an edge connecting Vertices u and v. It is not allowed to add an edge if there is already an edge connecting Vertices u and v.

Find the maximum possible number of edges that can be added.

Constraints

2 \leq N \leq 10^5

1 \leq M \leq 10^5

1 \leq A_i,B_i \leq N

The graph has no self-loops or multiple edges.

The graph is connected.

Input

Input is given from Standard Input in the following format:

N M
A_1 B_1
A_2 B_2
:
A_M B_M

Output

Find the maximum possible number of edges that can be added.

Sample Input 1

6 5
1 2
2 3
3 4
4 5
5 6

Sample Output 1

4

If we add edges as shown below, four edges can be added, and no more.

Sample Input 2

5 5
1 2
2 3
3 1
5 4
5 1

Sample Output 2

5

Five edges can be added, for example, as follows:

Add an edge connecting Vertex 5 and Vertex 3.

Add an edge connecting Vertex 5 and Vertex 2.

Add an edge connecting Vertex 4 and Vertex 1.

Add an edge connecting Vertex 4 and Vertex 2.

Add an edge connecting Vertex 4 and Vertex 3.

Solution in Go (1.6) (judge verdict: Runtime Error)

package main

import (
  "bufio"
  "os"
  "strconv"
  "strings"
  "fmt"
)

var reader = bufio.NewReaderSize(os.Stdin, 1000000)
var writer = bufio.NewWriter(os.Stdout)
func NextLine() string {
  var line, buffer []byte
  var isPrefix bool = true
  var err error
  for isPrefix {
    line, isPrefix, err = reader.ReadLine()
    if err != nil { panic(err) }
    buffer = append(buffer, line...)
  }
  return string(buffer)
}
func NextIntVec() []int {
  L := strings.Split(NextLine(), " ")
  N := make([]int, len(L))
  for i := range N {
    N[i], _ = strconv.Atoi(L[i])
  }
  return N
}
func Write(s interface{}) {
  fmt.Fprintln(writer, s)
}
func Output() {
  _ = writer.Flush()
}

func main() {
  NM := NextIntVec()
  N := NM[0]
  M := NM[1]
  G := make([][]int, N)
  for i := range G {
    G[i] = make([]int, 0)
  }
  for i := 0; i < M; i++ {
    AB := NextIntVec()
    A := AB[0] - 1
    B := AB[1] - 1
    G[A] = append(G[A], B)
    G[B] = append(G[B], A)
  }
  D := make([]int, N)
  for i := 1; i < N; i++ {
    D[i] = N
  }
  Q := make([]int, N)
  pos := 1
  incomplete := true
  for i := 0; i < N && incomplete; i++  {
    s := Q[i]
    for _, adj := range G[s] {
      if D[adj] < D[s] { continue }
      if D[adj] == D[s] {
        incomplete = false
        break
      }
      D[adj] = D[s] + 1
      Q[pos] = adj
      pos += 1
    }
  }
  cnt := N * (N - 1) / 2 - M
  if incomplete {
  	OE := []int{0, 0}
  	for _, d := range D {
      OE[d % 2] += 1
  	}
    cnt -= OE[0] * (OE[0] - 1) / 2 + OE[1] * (OE[1] - 1) / 2  
  }
  Write(cnt)
  Output()
}