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

#include<cstdio>
#include<vector>
using namespace std;
#define LL long long

int n,m;
vector<int>a[100001];
char b[100001][2];
LL ans,sum[3];

inline char readc(void){
	static char fl[10000],*A=fl,*B=fl;
	return A==B&&(B=(A=fl)+fread(fl,1,10000,stdin),A==B)?EOF:*A++;
}
inline int read(void){
	int a=0;static char c;
	while((c=readc())<'0'||c>'9');
	while(c>='0'&&c<='9')a=a*10+c-'0',c=readc();
	return a;
}
void Dfs(int x,int d){
	b[x][d]=1;
	for(int i=0;i<a[x].size();++i)
		if(b[a[x][i]][d^1]==0)
			Dfs(a[x][i],d^1);
	return;
}
int main(void){
	n=read(),m=read();
	register int i,x,y;
	for(i=1;i<=m;++i)
		x=read(),y=read(),a[x].push_back(y),a[y].push_back(x);
	Dfs(1,0);
	for(i=2;i<=n;++i){
		if(b[i][0]&&!b[i][1])
			++sum[0];
		if(b[i][1]&&!b[i][0])
			++sum[1];
		if(b[i][1]&&b[i][0])
			++sum[2];
	}
	ans=sum[1]+sum[2];
	ans+=sum[2]*(sum[2]-1)>>1;
	ans+=sum[2]*sum[1];
	ans+=sum[2]*sum[0];
	ans+=sum[0]*sum[1];
	printf("%lld\n",ans-m);
	return 0;
}