12 12
5 1
5 11
1 11
8 11
8 9
5 12
6 9
7 11
9 3
9 10
4 12
10 2
78
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
2 2
2 3
2 4
2 5
2 6
2 7
2 8
2 9
2 10
2 11
2 12
3 3
3 4
3 5
3 6
3 7
3 8
3 9
3 10
3 11
3 12
4 4
4 5
4 6
4 7
4 8
4 9
4 10
4 11
4 12
5 5
5 6
5 7
5 8
5 9
5 10
5 11
5 12
6 6
6 7
6 8
6 9
6 10
6 11
6 12
7 7
7 8
7 9
7 10
7 11
7 12
8 8
8 9
8 10
8 11
8 12
9 9
9 10
9 11
9 12
10 10
10 11
10 12
11 11
11 12
12 12

1
3
6
10
15
21
28
36
45
55
65
76
1
3
6
10
15
21
28
36
45
55
66
1
3
6
10
15
21
28
36
45
55
1
3
6
10
15
21
28
36
45
1
3
6
10
15
21
28
36
1
3
6
10
15
21
28
1
3
6
10
15
21
1
3
6
10
15
1
3
6
10
1
3
6
1
3
1

#include <bits/stdc++.h>
using namespace std;
int readint() {
  int t = 0, f = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (isdigit(c)) {
    t = (t << 3) + (t << 1) + c - '0';
    c = getchar();
  }
  return t * f;
}
const int maxn = 300009, maxm = 600009;
struct edge {
  int v;
  edge* next;
} e[maxm], *pt = e, *fir[maxn];
int n, m, ans, dfstime, scccnt, circnt, a[maxn], d[maxn], p[maxn], size[maxn],
    pre[maxn], low[maxn], scc[maxn];
long long s[maxn], sum[maxn];
void mul() {
  for (int i = 1; i <= (n + 1); i++) s[i] = long long(i) * long long(i - 1);
}
bool vis[maxn], check[maxn];
void add(int u, int v) {
  pt->v = v;
  pt->next = fir[u];
  fir[u] = pt++;
}
void addedge(int u, int v) {
  add(u, v);
  add(v, u);
}
stack<int> S;
void dfs(int x, int f) {
  pre[x] = low[x] = ++dfstime;
  S.push(x);
  for (edge* e = fir[x]; e; e = e->next)
    if (e->v != f) {
      if (!pre[e->v]) {
        dfs(e->v, x);
        low[x] = min(low[x], low[e->v]);
      } else if (!scc[e->v])
        low[x] = min(low[x], pre[e->v]);
    }
  if (pre[x] == low[x]) {
    int t = -1;
    ++scccnt;
    while (t != x) {
      t = S.top();
      S.pop();
      scc[t] = scccnt;
      size[scccnt]++;
    }
  }
}
void Dfs(int x, int f) {
  S.push(x);
  check[x] = 1;
  for (edge* e = fir[x]; e; e = e->next)
    if (e->v != f && scc[e->v] == scc[x]) {
      if (check[e->v] && !p[x]) {
        int t = -1, mx = 0, _mx = 0, mn = maxn, cnt = 0;
        ++circnt;
        while (t != e->v) {
          t = S.top();
          S.pop();
          a[++cnt] = t;
          p[t] = circnt;
          if (t > mx) {
            _mx = mx;
            mx = t;
          }
          mn = min(t, mn);
        }
        for (int i = 1; i <= (cnt); i++)
          d[a[i]] = max(a[i], a[i] == mn ? _mx : mx);
        return;
      } else if (!check[e->v]) {
        Dfs(e->v, x);
      }
    }
}
void tarjan() {
  for (int i = 1; i <= (n); i++) d[i] = i;
  for (int i = 1; i <= (n); i++)
    if (!scc[i]) dfs(i, -1);
  for (int i = 1; i <= (n); i++)
    if (!vis[scc[i]]) {
      while (!S.empty()) S.pop();
      vis[scc[i]] = 1;
      Dfs(i, -1);
    }
  for (int i = n; i; i--)
    if (!p[i] || !p[d[i] + 1] || p[d[i] + 1] != p[i]) {
      d[i] = max(d[i], d[d[i] + 1]);
    }
  for (int i = n; i; i--) sum[i] = sum[i + 1] + long long(d[i]);
}
int main() {
  n = readint();
  m = readint();
  mul();
  for (int i = 1; i <= (m); i++) {
    int U = readint(), V = readint();
    addedge(U, V);
  }
  tarjan();
  int q = readint();
  while (q--) {
    int l = readint(), r = readint(), L = l, R = r;
    while (L < R) {
      int mid = (L + R) >> 1;
      if (d[mid] < r)
        L = mid + 1;
      else
        R = mid;
    }
    long long ans = s[r - l + 1] / 2ll + long long(r - l + 1) -
                    long long(r) * long long(L - l) + sum[l] - sum[L];
    cout << ans << endl;
  }
  return 0;
}
