显示代码纯文本
#include<cstdio>
#include<cmath>
#define int long long
using namespace std;
int n,m,fa[500005][22],fb[500005][22],fc[500005][22];
const int mod=4294967296;
int s[1005][1005];
int gcd(int m,int n){
if(!n)return m;
int r=m%n;
while(r){
m=n;
n=r;
r=m%n;
}
return n;
}
int ans=0;
signed main(){
freopen("shijian.in","r",stdin);
freopen("shijian.out","w",stdout);
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&fa[i][0]);
for(int i=1;i<=n;i++)scanf("%lld",&fb[i][0]);
for(int i=1;i<=n;i++)scanf("%lld",&fc[i][0]);
for(int j=1;(1<<j)<=n;j++){
for(int i=1;i+(1<<j)-1<=n;i++){
fa[i][j]=fa[i][j-1]&fa[i+(1<<(j-1))][j-1];
fb[i][j]=fb[i][j-1]|fb[i+(1<<(j-1))][j-1];
fc[i][j]=gcd(fc[i][j-1],fc[i+(1<<(j-1))][j-1]);
}
}
for(int l=1;l<=n;l++){
for(int r=l;r<=n;r++){
int k=log2(r-l+1);
int aans=fa[l][k]&fa[r-(1<<k)+1][k];
int bans=fb[l][k]|fb[r-(1<<k)+1][k];
int cans=gcd(fc[l][k],fc[r-(1<<k)+1][k]);
int Ans=(aans*bans%mod)*cans%mod;
s[l][r]=Ans;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
s[i][j]+=s[i-1][j];
s[i][j]%=mod;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
s[i][j]+=s[i][j-1];
s[i][j]%=mod;
}
}
for(int i=1;i<=m;i++){
int l,r;
scanf("%lld%lld",&l,&r);
int Ans=s[r][r]-s[r][l-1]-s[l-1][r]+s[l-1][l-1];
Ans=(Ans%mod+mod)%mod;
if(m<=100000){
printf("%lld\n",Ans);
}
else{
ans^=Ans;
ans%=mod;
}
}
if(m>100000){
printf("%lld",ans);
}
return 0;
}