代码:
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN = 5e4 + 10;
int a[MAXN],L[MAXN],R[MAXN],tag[MAXN],belong[MAXN];
int n,block,num;
void build(){
block=sqrt(n);
num=n/block;
if(n%block) num++;
for(int i=1;i<=num;i++){
L[i]=(i-1)*block+1;
R[i]=i*block;
}
R[num]=n;
for(int i=1;i<=n;i++){
belong[i]=(i-1)/block+1;
}
}
void add(int l,int r,int x){
if(belong[l]==belong[r]){
for(int i=l;i<=r;i++){
a[i]+=x;
}
}
else{
for(int i=l;i<=R[belong[l]];i++){
a[i]+=x;
}
for(int i=belong[l]+1;i<belong[r];i++){
tag[i]+=x;
}
for(int i=L[belong[r]];i<=r;i++){
a[i]+=x;
}
}
}
int query(int l,int r,int mod){
int ans=0;
if(belong[l]==belong[r]){
for(int i=l;i<=r;i++){
ans+=a[i]+tag[belong[l]];
ans%=mod;
}
}
else{
for(int i=l;i<=R[belong[l]];i++){
ans+=a[i]+tag[belong[l]];
ans%=mod;
}
for(int i=belong[l]+1;i<belong[r];i++){
ans+=tag[i]*block;
ans%=mod;
}
for(int i=L[belong[r]];i<=r;i++){
ans+=a[i]+tag[belong[r]];
ans%=mod;
}
}
return ans%mod;
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build();
for(int i=1;i<=n;i++){
int opt,l,r,c;
scanf("%lld%lld%lld%lld",&opt,&l,&r,&c);
if(opt==0){
add(l,r,c);
}
else{
printf("%lld\n",query(l,r,c+1));
}
}
}