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 C (GCC 5.4.1) (judge verdict: Accepted)

#include <stdio.h>
#include <stdlib.h>
#define FOR(i,a,n) for(i=(a);i<(n);i++)
#define swap(type,a,b) do{type t=a;a=b;b=t;}while(0);
#define MAX(a,b) (((a)>(b))?(a):(b))
#define INF 1000000000000000LL
#define ll long long
#define MAX_V 100000
#define MAX_E 200000
typedef struct LIST{
	int to;
	struct LIST *next;
}Edge;
Edge *g[MAX_V];
Edge edge[MAX_E];
int e_size=0;
void add_edge(int s,int t){
	edge[e_size].next=g[s]; g[s]=&edge[e_size++];
	g[s]->to=t;
	return;
}
int color[MAX_V];
int dfs(int v,int c){
	Edge *e;
	color[v]=c;
	for(e=g[v];e!=NULL;e=e->next){
		if(color[e->to]==-c) continue;
		if(color[e->to]==color[v]||!dfs(e->to,-c)) return 0;
	}
	return 1;
}
int main(void)
{
	int n,m,a,b,cnt=0,flag,i;
	scanf("%d%d",&n,&m);
	FOR(i,0,m){
		scanf("%d%d",&a,&b);
		add_edge(--a,--b);
		add_edge(b,a);
	}
	flag=dfs(0,1);
	FOR(i,0,n) cnt+=(color[i]==1);
	if(!flag) printf("%lld\n",(ll)n*(n-1)/2-m);
	else printf("%lld\n",(ll)cnt*(n-cnt)-m);
	return 0;
}