树状数组的好题。
#include<bits/stdc++.h>
#define lowbit(x) ((x)&(-(x)))
#define ll long long
#define INF 2147483647
#define CLR(a) memset(a, 0, sizeof(a))
using namespace std;
const int maxn=2e5+10;
int n,m,p[maxn],id[maxn];
vector<int> g[maxn];
vector<pair<int,int> > q[maxn];
int tree[maxn];
int ans[maxn];
void add(int x,int val){
for(int i=x;i<=maxn;i+=lowbit(i)){
tree[i]+=val;
}
}
int sum(int x){
int ans=0;
for(int i=x;i>0;i-=lowbit(i)){
ans+=tree[i];
}
return ans;
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&p[i]);
id[p[i]]=i;
}
for(int i=1;i<=n;i++){
for(int j=p[i];j<=n;j+=p[i]){
g[max(i,id[j])].push_back(min(i,id[j]));
}
}
for(int i=1;i<=m;i++){
int s,t;
scanf("%d%d",&s,&t);
q[t].push_back({s,i});
}
for(int i=1;i<=n;i++){
for(auto v:g[i]) add(v,1);
for(auto v:q[i]) ans[v.second]=sum(i)-sum(v.first-1);
}
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}