1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define ft first
#define sd second
const int N=5e5+5,M=500+5,B=320;
int n,m,sq;
int a[N];
int sum[M][M];
int pre1[M],pre2[M][M];
int qx[N],qy[N],qm[N];
vector<pii> vec[N];
int ans[N];
void add(int x)
{
int Id=x/B+1,_Id=x%B;
for(int i=_Id;i<B;i++)
pre2[Id][i]++;
for(int i=Id;i<=(100000)/B+1;i++)
pre1[i]++;
}
int query(int x)
{
int Id=x/B+1,_Id=x%B;
return pre1[Id-1]+pre2[Id][_Id];
}
int work(int x,int y,int m)
{
if(x<y) swap(x,y);
int l=m-x,r=m-y-1,res=0;
if(m<sq){
for(int i=l;i<=r;i++)
res+=sum[m][i];
return res;
}
for(int L=l,R=r;L<=100000;L+=m,R=min(R+m,100000))
res+=query(R)-query(L-1);
return res;
}
signed main()
{
scanf("%d%d",&n,&m);
sq=sqrt(n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1,l,r;i<=m;i++){
scanf("%d%d%d%d%d",&l,&r,&qx[i],&qy[i],&qm[i]);
qx[i]%=qm[i],qy[i]%=qm[i];
if(qx[i]==qy[i])
continue;
vec[l-1].push_back({i,-1});
vec[r].push_back({i,1});
}
for(int i=1;i<=n;i++){
for(int j=1;j<sq;j++)
sum[j][a[i]%j]++;
add(a[i]);
for(pii j:vec[i]){
int p=j.ft;
int tmp=work(qx[p],qy[p],qm[p]);
if(qx[p]<qy[p])
tmp=i-tmp;
ans[p]+=j.sd*tmp;
}
}
for(int i=1;i<=m;i++){
if(qx[i]==qy[i])
puts("0");
else
printf("%d\n",ans[i]);
}
return 0;
}
|