#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
struct segtree{
	vector<ll>tree;
	int size;
	segtree(int n){
		size=1;
		while(size<n){
			size*=2;
		}
		tree.assign(size*2-1,0);
	}
	void upd(int i,ll v,int x,int lx,int rx){
		if(rx-lx==1){
			tree[x]=max(tree[x],v);
			return;
		}
		int mid=(lx+rx)/2;
		if(i<mid){
			upd(i,v,x*2+1,lx,mid);
		}else{
			upd(i,v,x*2+2,mid,rx);
		}
		tree[x]=max(tree[x*2+1],tree[x*2+2]);
	}
	void upd(int i,ll v){
		upd(i,v,0,0,size);
	}
	ll get(int l,int r,int x,int lx,int rx){
		if(l>=rx||r<=lx){
			return 0;
		}
		if(l<=lx&&r>=rx){
			return tree[x];
		}
		int mid=(lx+rx)/2;
		return max(get(l,r,x*2+1,lx,mid),get(l,r,x*2+2,mid,rx));
	}
	ll get(int l,int r){
		return get(l,r,0,0,size);
	}
};
int main(){
	int n,q;
	cin>>n>>q;
	vector<int>a(n+1);
	vector<ll>s(n+1);
	vector<vector<int>>dp(n+1,vector<int>(20));
	vector<vector<pair<int,int>>>ask(n+1);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		dp[i][0]=a[i];
		s[i]=s[i-1]+a[i];
	}
	for(int k=1;k<20;k++){
		for(int i=1;i+(1<<k)-1<=n;i++){
			dp[i][k]=__gcd(dp[i][k-1],dp[i+(1<<(k-1))][k-1]);
		}
	}
	auto get=[&](int l,int r){
		int k=31-__builtin_clz(r-l+1);
		return __gcd(dp[l][k],dp[r-(1<<k)+1][k]);
	};
	for(int i=0;i<q;i++){
		int l,r;
		cin>>l>>r;
		ask[r].push_back({l,i});
	}
	segtree st(n+1);
	vector<ll>ans(q);
	for(int r=1;r<=n;r++){
		int i=r;
		while(i>=1){
			int lo=0,hi=i;
			while(hi-lo>1){
				int mid=(lo+hi)/2;
				if(get(mid,r)!=get(i,r)){
					lo=mid;
				}else{
					hi=mid;
				}
			}
			st.upd(lo+1,(s[r]-s[lo])*get(lo+1,r));
			i=lo;
		}
		for(auto&[l,id]:ask[r]){
			ans[id]=st.get(l,r+1);
			int i=l;
			while(i<=r){
				int lo=i,hi=r+1;
				while(hi-lo>1){
					int mid=(lo+hi)/2;
					if(get(l,i)==get(l,mid)){
						lo=mid;
					}else{
						hi=mid;
					}
				}
				ans[id]=max(ans[id],(s[lo]-s[l-1])*get(l,lo));
				i=hi;
			}
		}
	}
	for(auto&x:ans){
		cout<<x<<"\n";
	}
}