分块板子简易写法
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,a[1000000],siz;
ll k[1000000],lazy[1000000];
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
ll opt,l,r,c;
ll nn=n;
siz=sqrt(n);
for(int i=0;i<n;i++){
k[i/siz]+=a[i];
}
while(nn--){
cin>>opt>>l>>r;
l--,r--;
ll st=l/siz,ed=r/siz;
if(opt==0){
cin>>c;
if(st==ed){
for(int i=l;i<=r;i++){
a[i]+=c;
k[st]+=c;
}
}
else{
for(int i=l;i<(st+1)*siz;i++){
a[i]+=c;
k[st]+=c;
}
for(int i=st+1;i<ed;i++){
lazy[i]+=c;
k[i]+=c*siz;
}
for(int i=ed*siz;i<=r;i++){
a[i]+=c;
k[ed]+=c;
}
}
}
else{
ll sum=0;
cin>>c;
if(st==ed){
for(int i=l;i<=r;i++){
sum+=a[i]+lazy[st];
sum%=(c+1);
}
}
else{
for(int i=l;i<(st+1)*siz;i++){
sum+=a[i]+lazy[st];
sum%=(c+1);
}
for(int i=st+1;i<ed;i++){
sum+=k[i];
sum%=(c+1);
}
for(int i=ed*siz;i<=r;i++){
sum+=a[i]+lazy[ed];
sum%=(c+1);
}
}
cout<<sum<<"\n";
}
}
return 0;
}
可以自由转载

浙公网安备 33010602011771号