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

import java.io.* ; import java.util.* ; import java.math.* ;
import static java.lang.Math.min ;
import static java.lang.Math.max ;

public class Codeshefcode{
	public static void main(String[] args) throws IOException{
		/*Solver Machine = new Solver() ;
		Machine.Solve() ; Machine.Finish() ;*/
		new Thread(null,new Runnable(){
			public void run(){
				Solver Machine = new Solver() ;
				try{
					Machine.Solve() ; Machine.Finish() ;
				}catch(Exception e){
					e.printStackTrace() ; System.out.flush() ;
					System.exit(-1) ;
				}catch(Error e){
					e.printStackTrace() ; System.out.flush() ;
					System.exit(-1) ;
				}
			}
		},"Solver",1l<<27).start() ;
	}
}

class mylist extends ArrayList<Integer>{}
class myset extends TreeSet<Integer>{}
class mystack extends Stack<Integer>{}
class mymap extends TreeMap<Long,Integer>{}

class pair implements Comparable<pair>{
	int x ; int y ; 
	pair(int x,int y){ this.x=x ; this.y=y ;} 
	public int compareTo(pair p){
		return (this.x<p.x ? -1 : (this.x>p.x ? 1 : (this.y<p.y ? -1 : (this.y>p.y ? 1 : 0)))) ;
	}
}

class Solver{
	Reader ip = new Reader(System.in) ;	  
	PrintWriter op = new PrintWriter(System.out) ;
	mylist adj[] ;
	int mrk=0 ;
	int par[] ;
	int cyc[] ;
	public void Solve() throws IOException{
		int n = ip.i() ;
		int m = ip.i() ;
		adj =  new mylist[n+1] ;
		par = new int[n+1] ;
		cyc = new int[n+1] ;
		Arrays.fill(cyc,-1) ;
		for(int i=1 ; i<=n ; i++) adj[i] = new mylist() ;
		for(int i=1 ; i<=m ; i++){
			int u = ip.i() ;
			int v = ip.i() ;
			adj[u].add(v) ;
			adj[v].add(u) ;
		}
		for(int i=1 ; i<=n ; i++) if(par[i]==0) dfs(i,new myset()) ;
		int lw[] = new int[mrk] ;
		int hg[] = new int[mrk] ;
		Arrays.fill(lw,Integer.MAX_VALUE) ;
		Arrays.fill(hg,Integer.MIN_VALUE) ;
		for(int i=1 ; i<=n ; i++){
			if(cyc[i]==-1) continue ;
			lw[cyc[i]] = min(lw[cyc[i]],i) ;
			hg[cyc[i]] = max(hg[cyc[i]],i) ;
		}
		int lim[] = new int[n+1] ;
		Arrays.fill(lim,n+1) ;
		for(int i=1 ; i<=n ; i++){
			if(cyc[i]==-1) continue ;
			if(i==lw[cyc[i]]) lim[i] = hg[cyc[i]] ;
		}
		for(int i=n ; i>=1 ; i--)
			lim[i] = min(lim[i],i==n ? n+1 : lim[i+1]) ;
		long clim[] = new long[n+1] ;
		for(int i=1 ; i<=n ; i++) clim[i] = clim[i-1]+lim[i] ;
		int q = ip.i() ;
		while(q--!=0){
			int l = ip.i() ;
			int r = ip.i() ;
			int idx = Arrays.binarySearch(lim,l,r+1,r+1) ;
			if(idx<0) idx = -idx-1 ;
			long res = (clim[idx-1]-clim[l-1])-(((idx-l)*(l+idx-1l))/2) ;
			res+=(((r-idx+1l)*(r-idx+2))/2) ;
			pln(res) ; 
		}
	}
	void dfs(int nd,myset anc){
		for(int chd : adj[nd]){
			if(chd==par[nd]) continue ;
			if(par[chd]==0){
				anc.add(nd) ;
				par[chd]=nd ;
				dfs(chd,anc) ;
				anc.remove(nd) ;
			}else if(cyc[chd]==-1){
				mylist cnd = new mylist() ;
				int itr=nd ;
				while(itr!=chd){
					cnd.add(itr) ;
					itr = par[itr] ;
				}
				cnd.add(chd) ;
				for(int elem : cnd) cyc[elem]=mrk ;
				mrk++ ;
			}
		}
	}
	void Finish(){ op.flush();	op.close(); }
	void p(Object o){ op.print(o) ; }
	void pln(Object o){ op.println(o) ;}		
}

class Mod{
	static long mod=1000000007 ;
	static long d(long a,long b){ return (a*inv(b))%mod ; }
	static long m(long a,long b){ return (a*b)%mod ; }
	static long inv(long a){ return pow(a,mod-2) ; }
	static long pow(long a,long b){
		if(b<0) return pow(inv(a),-b) ;
		long val=a ; long ans=1 ;
		while(b!=0){
			if((b&1)==1) ans = (ans*val)%mod ; 
			val = (val*val)%mod ; 
			b/=2 ;
		}
		return ans ;
	}	
}
class Reader{
	BufferedReader reader;
	StringTokenizer tkz;
	Reader(InputStream input) {
		reader = new BufferedReader(new InputStreamReader(input)) ;
		tkz = new StringTokenizer("") ;
	}
	String s() throws IOException{
		while (!tkz.hasMoreTokens()) tkz = new StringTokenizer(reader.readLine()) ;
		return tkz.nextToken() ;
	}
	int i() throws IOException{ return Integer.parseInt(s()) ;}
	long l() throws IOException{ return Long.parseLong(s()) ;}
	double d() throws IOException{	return Double.parseDouble(s()) ;}
}