块长开到 50 可过
参考代码
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e5+10;
int a[N],b[N];
struct node{
int l,r,sum,osm;
};
node fk[N];
int k[N];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
int len=50;
int num=n/len;
if(n%len){
num++;
}
for(int i=1;i<=n;i++){
k[i]=(i-1)/len+1;
}
for(int i=1;i<=num;i++){
fk[i].l=(i-1)*len+1;
fk[i].r=i*len;
}
fk[num].r=n;
for(int i=1;i<=n;i++){
cin>>a[i];
fk[k[i]].sum+=a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
fk[k[i]].osm+=(b[i]==1);
}
int q;
cin>>q;
for(int kk=1;kk<=q;kk++){
int op;
cin>>op;
if(op==1){
int w,x;
cin>>w>>x;
fk[k[w]].sum-=a[w];
a[w]=x;
fk[k[w]].sum+=a[w];
}
if(op==2){
int w,x;
cin>>w>>x;
if(b[w]==1){
fk[k[w]].osm--;
}
b[w]=x;
if(b[w]==1){
fk[k[w]].osm++;
}
}
if(op==3){
int l,r;
cin>>l>>r;
int sum=0;
for(int i=l;i<=r;i++){
if(fk[k[i]].osm==fk[k[i]].r-fk[k[i]].l+1&&i==fk[k[i]].l&&fk[k[i]].r<=r){
sum+=fk[k[i]].sum;
i=fk[k[i]].r;
continue;
}
if(sum*2>1e18&&i==fk[k[i]].l&&fk[k[i]].r<=r){
sum+=fk[k[i]].sum;
i=fk[k[i]].r;
continue;
}
if(sum+a[i]<sum*b[i]){
sum*=b[i];
}
else{
sum+=a[i];
}
}
cout<<sum<<endl;
}
}
return 0;
}