P8421 [THUPC2022 决赛] rsraogps
首先考虑离线扫描线,扫描
我们设
然后考虑
查询是
#include<iostream>
#include<vector>
#include<utility>
using std::cin;
using std::cout;
#define int unsigned
int n,m,a[1000010],b[1000010],c[1000010];
int gcd(int x,int y){
return x?gcd(y%x,x):y;
}
std::vector<std::pair<int,int>> vec[1000010];
int ans[5000010];
int T;
int val[1000010],ad[1000010],nt[1000010];
int query(int p){
return val[p]+ad[p]*(T-nt[p]);
}
signed main(){
std::ios::sync_with_stdio(false),cin.tie(nullptr);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++) cin>>c[i];
for(int i=1,l,r;i<=m;i++) cin>>l>>r,vec[r].emplace_back(l,i);
for(int i=1;i<=n;i++){
int p=i-1;
while(p!=0){
int u=a[p]&a[p+1];
int v=b[p]|b[p+1];
int w=gcd(c[p],c[p+1]);
if(u==a[p]&&v==b[p]&&w==c[p]) break;
a[p]=u,b[p]=v,c[p]=w;
--p;
}
val[i]=query(i-1);
for(int j=p+1;j<=i;j++){
val[j]=query(j);
ad[j]=ad[j-1]+a[j]*b[j]*c[j];
nt[j]=T;
}
++T;
for(auto [l,id]:vec[i]) ans[id]=query(i)-query(l-1);
}
for(int i=1;i<=m;i++) cout<<ans[i]<<'\n';
return 0;
}