/*▄███████▀▀▀▀▀▀███████▄
░▐████▀▒ЗАПУСКАЕМ▒▀██████▄
░███▀▒▒▒▒▒ДЯДЮ▒▒▒▒▒▒▀█████
░▐██▒▒▒▒▒БОГДАНA▒▒▒▒▒████▌
░▐█▌▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▌
░░█▒▄▀▀▀▀▀▄▒▒▄▀▀▀▀▀▄▒▐███▌
░░░▐░░░▄▄░░▌▐░░░▄▄░░▌▐███▌
░▄▀▌░░░▀▀░░▌▐░░░▀▀░░▌▒▀▒█▌
░▌▒▀▄░░░░▄▀▒▒▀▄░░░▄▀▒▒▄▀▒▌
░▀▄▐▒▀▀▀▀▒▒▒▒▒▒▀▀▀▒▒▒▒▒▒█
░░░▀▌▒▄██▄▄▄▄████▄▒▒▒▒█▀
░░░░▄█████████████  █▒▒▐▌
░░░▀███▀▀████▀█████▀▒▌
░░░░░▌▒▒▒▄▒▒▒▄▒▒▒▒▒▒▐
░░░░░▌▒▒▒▒▀▀▀▒▒▒▒▒▒▒▐*/
#define _GLIBCXX_DEBUG
#pragma GCC optimize("O3,unroll-loops")//,"inline","-ffast-math")
//#pragma GCC target("arch=icelake-server")
//#pragma GCC target("sse", "sse2", "sse3", "ssse3", "sse4")
//#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
//#pragma GCC optimize("avx,avx2,ssse3,tune-native")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
//#include "atcoder"
#define x first
#define fi first
#define y second
#define se second
#define int long long
//#define double long double
#define sqrt sqrtl
#define M_PI (double)3.14159265358979323846
#define fast ios_base::sync_with_stdio(false);cout.tie(nullptr);cin.tie(nullptr);
#define endl '\n'
#define N (int)(2e5+10)
//#define mod (int)(1e9+7)
#define mod (int)(998244353)
//#define mod (int)(167772161)
using namespace std;
//using namespace atcoder;
using namespace __gnu_pbds;
vector<pair<int,int>>mo={{1,0},{-1,0},{0,1},{0,-1}};
vector<pair<int,int>>mo2={{1,1},{-1,1},{-1,-1},{1,-1}};
vector<pair<int,int>>mok={{1,2},{2,1},{-1,2},{-2,1},{1,-2},{2,-1},{-1,-2},{-2,-1}};
vector<pair<int,int>>moK={{1,1},{-1,1},{1,-1},{-1,-1},{1,0},{0,1},{-1,0},{0,-1}};
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>ordered_set;
int bp(int a,int b) {
    if (b == 0) {
        return 1;
    }
    if (b & 1) {
        return (a * bp(a, b - 1)) % mod;
    }
    int q = bp(a, b >> 1);
    return (q * q) % mod;
}
int su(int l,int r){
    return ((r-l+1)*(r+l)/2);
}
struct sparse{
    const int LOG=20;
    vector<vector<int>> t;
    void init(int n){
        t.resize(n);
        for(int i=0;i<n;i++){
            t[i].resize(LOG);
        }
    }
    void build(vector<int>&a){
        init(a.size());
        int n=a.size();
        for(int i=0;i<n;i++)t[i][0]=a[i];
        for(int k=1;k<LOG;k++){
            for(int i=0;i+(1ll<<k)-1<n;i++){
                t[i][k]=__gcd(t[i][k-1],t[i+(1ll<<(k-1))][k-1]);
            }
        }
    }
    int get(int l,int r){
        if(l>r)return 0;
        int k=31-__builtin_clz(r-l+1);
        return __gcd(t[l][k],t[r-(1ll<<k)+1][k]);
    }
};
struct segtree
{
    struct Node
    {
        Node *l=0;
        Node *r=0;
        int val=LLONG_MIN;
    };
    Node* p=0;
    void set(Node *&p,int i,int val,int lx,int rx)
    {
        if(!p)p=new Node();
        if(rx-lx==1)
        {
            p->val=max(p->val,val);
            return;
        }
        int m=(lx+rx)/2;
        if(i<m)set(p->l,i,val,lx,m);
        else set(p->r,i,val,m,rx);
        p->val=max((p->l?p->l->val:LLONG_MIN),(p->r?p->r->val:LLONG_MIN));
    }
    void set(int i,int v)
    {
        set(p,i,v,LLONG_MIN,LLONG_MAX);
    }
    int get(Node *&p,int l,int r,int lx,int rx)
    {
        if(!p)return LLONG_MIN;
        if(rx<=l||lx>=r)return LLONG_MIN;
        if(lx>=l&&rx<=r)return p->val;
        int m=(lx+rx)/2;
        return max(get(p->l,l,r,lx,m),get(p->r,l,r,m,rx));
    }
    int get(int l,int r)
    {
        return get(p,l,r,LLONG_MIN,LLONG_MAX);
    }
};
void Bogdan(){
    int n,q;
    cin>>n>>q;
    int gc[n+1][30];
    memset(gc,0,sizeof gc);
    vector<int>a(n+1);
    int p_s[n+1];
    p_s[0]=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        p_s[i]=p_s[i-1]+a[i];
    }
    sparse sp;
    sp.build(a);
    for(int i=1;i<=n;i++){
        gc[i][0]=i;
        int l=i,r=n+1,X=1;
        while(X<=24){
            l=gc[i][X];
            r=n+1;
            while(r-l>1){
                int m=(l+r)/2;
                if(sp.get(i,m)==sp.get(i,l)){
                    l=m;
                }
                else{
                    r=m;
                }
            }
            gc[i][X]=l;
            X++;
            gc[i][X]=r;
        }
    }
    vector<pair<int,int>>v[n+1];
    for(int i=1,x,y;i<=q;i++){
        cin>>x>>y;
        v[x].push_back({y,i});
    }

    //return;
    int re[q+1];
    memset(re,0,sizeof re);
    segtree tr;
    for(int i=n;i>=1;i--){
        int R=gc[i][0],x=0;
        while(R<=n && x<=24){
            //cout<<R-1<<endl;
            tr.set(R,(p_s[R]-p_s[i-1])*sp.get(i,R));
            x++;
            R=gc[i][x];
        }
        for(auto &[t,in]:v[i]){
            re[in]=max(re[in],tr.get(i,t+1));
            int L=t;
            while(L>=i){
                int l=i-1,r=L;
                while(r-l>1){
                    int m=(l+r)/2;
                    if(sp.get(m,t)==sp.get(r,t)){
                        r=m;
                    }
                    else{
                        l=m;
                    }
                }
                re[in]=max(re[in],sp.get(r,t)*(p_s[t]-p_s[r-1]));
                L=r-1;
            }
        }
    }
    for(int i=1;i<=q;i++){
        cout<<re[i]<<endl;
    }cout<<endl;
}
/*
2
114 1000000000 5
514 2 10
*/
int32_t main(){
    fast;
    int t=1,n,k;
    //freopen("t1.txt","w",stdout);
    //init();
    //cin>>t;
    //cout<<"OK"<<endl;
    int q=0;
    while(t--){
        //cout<<"Case #"<<(++q)<<": ";
        Bogdan();
    }
}