我还真没找出错误。
AC 代码:
```cpp
#include<bits/stdc++.h>
#define int long long
#define inl inline
#define reg register
#define INF 1145141919810
#define N 100005
using namespace std;
int n,lx,rx,t,k,lm,rm,xm,m,s,a[N];
struct trees{
int l,r;
long long sum,lan,lan2=1;
}tree[N<<2];
inl int read(){
reg int f=1,x=0;
reg char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return f*x;
}
inl void write(int x){
if(x<0){
x=-x;
putchar('-');
}
if(x>=10) write(x/10);
putchar(x%10^48);
}
inl void build(int x,int ll,int rr){
tree[x].l=ll;
tree[x].r=rr;
if(ll==rr){
tree[x].sum=a[ll];
return;
}
reg int mid=(ll+rr)>>1;
build(x<<1,ll,mid);
build(x<<1|1,mid+1,rr);
tree[x].sum=(tree[x<<1].sum+tree[x<<1|1].sum)%s;
return;
}
inl void down(int x){
if(tree[x].lan2==1&&tree[x].lan==0) return;
tree[x*2].sum=(tree[x*2].sum*tree[x].lan2+tree[x].lan*(tree[x*2].r-tree[x*2].l+1))%s;
tree[x*2+1].sum=(tree[x*2+1].sum*tree[x].lan2+tree[x].lan*(tree[x*2+1].r-tree[x*2+1].l+1))%s;
tree[x*2].lan2=(tree[x*2].lan2*tree[x].lan2)%s;
tree[x*2+1].lan2=(tree[x*2+1].lan2*tree[x].lan2)%s;
tree[x*2].lan=(tree[x*2].lan*tree[x].lan2+tree[x].lan)%s;
tree[x*2+1].lan=(tree[x*2+1].lan*tree[x].lan2+tree[x].lan)%s;
tree[x].lan2=1;
tree[x].lan=0;
return;
}
inl int getsum(int x){
reg int m=0;
if(lx<=tree[x].l&&rx>=tree[x].r) return tree[x].sum;
down(x);
reg int mid=(tree[x].l+tree[x].r)>>1;
if(lx<=mid) m+=getsum(x<<1)%s;
if(rx>mid) m+=getsum(x<<1|1)%s;
return m%s;
}
inl void add(int x,int ll,int rr){
if(ll<=tree[x].l&&rr>=tree[x].r){
tree[x].sum=(tree[x].sum*k)%s;
tree[x].lan=(tree[x].lan*k)%s;
tree[x].lan2=(tree[x].lan2*k)%s;
return;
}
down(x);
reg int mid=(tree[x].l+tree[x].r)>>1;
if(ll<=mid) add(x*2,ll,rr);
if(rr>mid) add(x*2+1,ll,rr);
tree[x].sum=(tree[x*2].sum+tree[x*2+1].sum)%s;
return;
}
inl void add2(int x,int ll,int rr){
if(ll<=tree[x].l&&rr>=tree[x].r){
tree[x].sum=(tree[x].sum+k*(tree[x].r-tree[x].l+1))%s;
tree[x].lan=(tree[x].lan+k)%s;
return;
}
down(x);
reg int mid=(tree[x].l+tree[x].r)>>1;
if(ll<=mid) add2(x*2,ll,rr);
if(rr>mid) add2(x*2+1,ll,rr);
tree[x].sum=(tree[x*2].sum+tree[x*2+1].sum)%s;
return;
}
signed main(){
n=read();
s=read();
for(reg int i=1;i<=n;++i) a[i]=read();
t=read();
build(1,1,n);
for(reg int i=1;i<=t;++i){
xm=read();
if(xm==1){
lm=read();
rm=read();
k=read();
add(1,lm,rm);
}else if(xm==2){
lm=read();
rm=read();
k=read();
add2(1,lm,rm);
}else{
lx=read();
rx=read();
write(getsum(1));
putchar('\n');
}
}
return 0;
}
```
by zrl123456 @ 2024-02-10 13:45:17
就卡了卡常, 剪了剪枝, 就过了。
by zrl123456 @ 2024-02-10 13:47:24
思路基本相同。
by zrl123456 @ 2024-02-10 13:47:52
@[yangjinyi_ceshyong](/user/725725)
by zrl123456 @ 2024-02-10 13:48:32
好的谢谢
by vanishingloser @ 2024-02-14 11:34:16
已经过了,此帖终
by vanishingloser @ 2024-03-31 15:41:21