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<cstdio>
#include<algorithm>
#define N 600001
#define int long long
#define add_edge(u,v) nxt[++cnt]=head[u],head[u]=cnt,to[cnt]=v
#define open(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
char ch;void re(int& x)
{
	while(ch=getchar(),ch<33);x=ch-48;
	while(ch=getchar(),ch>33)x=x*10+ch-48;
}
using namespace std;
int n,m,ct,fir[N],fa[N],sy[N],sum[N],sm[N],l[N],r[N];
int cnt,head[N],nxt[N],to[N];
bool vis[N];
void dfs(int u)
{
	vis[u]=1;
	for(int i=head[u],v;i;i=nxt[i])
		if(!vis[v=to[i]])
		{
			fa[v]=u;
			dfs(v);
		}
		else if(v!=fa[u] && !sy[v])
		{
			++ct;
			l[ct]=r[ct]=u;
			sy[u]=ct;
			for(int j=u;j!=v;j=fa[j])	
			{
				sy[fa[j]]=ct;
				l[ct]=min(l[ct],fa[j]),
				r[ct]=max(r[ct],fa[j]);
			}
		}
}
main()
{
	re(n),re(m);
	for(int u,v;m--;)
	{
		re(u),re(v);
		add_edge(u,v);
		add_edge(v,u);
	}
	for(int i=1;i<=n;++i)
		if(!vis[i])
			dfs(i);
	for(int i=1;i<=n;++i)sum[i]=n;
	for(int i=1;i<=ct;++i)
		sum[l[i]]=min(sum[l[i]],r[i]-1);
	for(int i=n-1;i;--i)
		sum[i]=min(sum[i],sum[i+1]);
	for(int i=1;i<=n;++i)
		sm[i]=sm[i-1]+sum[i]-i+1;
	for(int i=n;i;--i)
		fir[sum[i]]=i;
	fir[n+1]=n;
	for(int i=n-1;i;--i)
		if(!fir[i])
			fir[i]=fir[i+1];
	int q;re(q);
	while(q--)
	{
		int x,y;
		re(x),re(y);
		int c=fir[y+1];
		if(c>y)printf("%I64d\n",sm[y]-sm[x-1]);
		else
		{
			int t=y-c+1;
			printf("%I64d\n",sm[c-1]-sm[x-1]+t*(t+1)/2);
		}
	}
}