/*
* Author: Geeza
*/

#include <bits/stdc++.h>

#define ld long double
#define ll long long
#define pb push_back
#define fin(a, n) for(int i = a; i < n; i++)
#define fjn(a, n) for(int j = a; j < n; j++)
#define all(a) a.begin(),a.end()
#define allr(a) a.rbegin(),a.rend()
#define FAST ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)

using namespace std;

const double PI = acos(-1);
const int N = 2e5+5;
const ll oo = 0x3f3f3f3f3f3f3f3f;
const int mod = 1000000007, inf = 1e6;

string di[] = {"D","L", "U", "R", "UL", "UR", "DL", "DR"};
int dx[] = {+1, +0, +0, -1, -1, -1, +1, +1};
int dy[] = {+0, -1, +1, +0, -1, +1, -1, +1};
char dc[] = {'D', 'L', 'R', 'U'};

struct node {
    ll cnt;
    node():cnt(0) {}
    node(ll x): cnt(x) {}
    void add(ll x) {
        cnt += x;
    }
};

struct segTree {
    ll treeSize;
    vector<node> tree;

    segTree(ll n) {
        treeSize = 1;
        while (treeSize < n) treeSize <<= 1;
        tree.resize(2 * treeSize, node());
    }

    node merge(node l, node r) {
        node parent = node();
        parent.cnt = l.cnt + r.cnt;
        return parent;
    }

    void update(ll idx, ll val, ll i, ll l, ll r) {
        if (r - l == 1) {
            tree[i].add(val);
            return;
        }

        ll mid = (l+r)/2;
        if (idx < mid) update(idx, val, 2*i+1, l, mid);
        else update(idx, val, 2*i+2, mid, r);
        tree[i] = merge(tree[2*i+1], tree[2*i+2]);
    }

    void update(ll idx, ll val) {
        update(idx, val, 0, 0, treeSize);
    }

    node query(ll l, ll r, ll n, ll lx, ll rx) {
        if (lx >= r || rx <= l) return node();
        if (lx >= l && rx <= r) return tree[n];

        ll mid = lx + (rx - lx) / 2;
        node lf = query(l, r, 2*n+1, lx, mid);
        node ri = query(l, r, 2*n+2, mid, rx);
        return merge(lf, ri);
    }

    ll query(ll l, ll r) {
        return query(l, r, 0, 0, treeSize).cnt;
    }
};

ll n, q;
vector<ll> divs;

void precompute() {
    divs.assign(N, 0);
    for (ll i = 1; i <= n; i++) {
        for (ll j = i; j <= n; j+=i) divs[j]++;
    }
}

void solve() {
    vector<ll> v(n);
    fin(0, n) cin >> v[i];

    vector<array<ll, 3>> queries(q);
    fin(0, q) {
        cin >> queries[i][0] >> queries[i][1];
        queries[i][0]--, queries[i][1]--, queries[i][2] = i;
    }

    sort(all(queries), [&](array<ll ,3> &a, array<ll, 3> &b) {
        if (a[1] == b[1]) return a[0] < b[0];
        return a[1] < b[1];
    });

    // for (auto [x, y] : queries) cout << x << " " << y << "\n";
    segTree st(n);
    vector<ll> ans(q);
    vector<bool> added(n, false);
    for (auto vec : queries) {
        ll l = vec[0], r = vec[1], idx = vec[2];
        for (int x = l; x <= r; x++) {
            if (added[x]) continue;
            st.update(x, divs[v[x]]);
            added[x] = true;
        }
        ans[idx] = st.query(l, r+1);
    }

    for (auto x : ans) cout << x << "\n";
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
#endif
    int tt = 1; //cin >> tt;
    while(tt--){
        cin >> n >> q;
        precompute();
        solve();
    }
    return 0;
}