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;
const int N = 3e5 + 5;
vector<vector<int>> g;
int in[N], out[N], mx[N], mn[N], t[N], cc;
long long cs[N];
void dfs(int u, int p) {
  in[u] = out[u] = cc++;
  for (auto i : g[u]) {
    if (!(in[i] + 1)) {
      dfs(i, u);
      out[u] = min(out[u], out[i]);
    } else if (i != p)
      out[u] = min(out[u], in[i]);
  }
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  g.resize(n + 1);
  memset(in, -1, sizeof in);
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    g[a].push_back(b);
    g[b].push_back(a);
  }
  fill(t, t + N, n);
  fill(mn, mn + N, 1e9);
  for (int i = 1; i <= n; i++)
    if (!(in[i] + 1)) dfs(i, -1);
  for (int i = 1; i <= n; i++)
    mx[out[i]] = max(mx[out[i]], i), mn[out[i]] = min(mn[out[i]], i);
  for (int i = 1; i <= n; i++)
    if (mn[out[i]] == i && mx[out[i]] != i) t[i] = mx[out[i]] - 1;
  for (int i = n; i; i--) {
    t[i] = min(t[i], t[i + 1]);
    cs[i] = t[i] - i + 1;
  }
  for (int i = 1; i <= n; i++) cs[i] += cs[i - 1];
  scanf("%d", &n);
  while (n--) {
    int l, r;
    scanf("%d%d", &l, &r);
    int L = l, R = r;
    while (L <= R) {
      int mid = (L + R) / 2;
      if (t[mid] > r)
        R = mid - 1;
      else
        L = mid + 1;
    }
    L--;
    printf("%lld\n", cs[L] - cs[l - 1] + (r - L) * (r - L + 1LL) / 2);
  }
}
