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<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+9;
struct edge{
    int to,next;
}edges[maxn<<1];
int head[maxn];
void addedge(int from,int to,int no){
    edges[no].to=to;
    edges[no].next=head[from];
    head[from]=no;
}
int n,m;
bool odd[maxn],eve[maxn];
void sol(int o){
    if(o>n){
        o-=n;
        odd[o]=1;
        for(int i=head[o];~i;i=edges[i].next){
            if(!eve[edges[i].to]){
                sol(edges[i].to);
            }
        }
    }
    else{
        eve[o]=1;
        for(int i=head[o];~i;i=edges[i].next){
            if(!odd[edges[i].to]){
                sol(edges[i].to+n);
            }
        }
    }
}
int main(){
    ios::sync_with_stdio(0);
    int e,f;
    while(cin>>n>>m){
        memset(head,-1,sizeof(head));
        memset(odd,0,sizeof(odd));
        memset(eve,0,sizeof(eve));
        for(int i=0;i<m;i++){
            cin>>e>>f;
            addedge(e,f,i<<1);
            addedge(f,e,i<<1|1);
        }
        sol(1);
        ll a=0,b=0;
        ll ans=n;
        ans*=(n-1);
        ans/=2;
        ans-=m;
        for(int i=1;i<=n;i++){
            if(odd[i]&&!eve[i])a++;
            if(!odd[i]&&eve[i])b++;
        }
        ans-=a*(a-1)/2;
        ans-=b*(b-1)/2;
        cout<<ans<<endl;
    }
}