#include<bits/stdc++.h>
#define gc ch=getchar()
#define pt puts("")
#define pc putchar(32)
using namespace std;
template <class T>void read(T &s){
s=0;T f=1;char gc;
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;gc;}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0';gc;}
s*=f;
}
template <class T>void put(T s){
if(s<0) putchar('-'),s=-s;
if(s>9) put(s/10);
putchar(s%10+'0');
}
struct segtree{
long long num,add,mul;
}t[400005];
int n,m;
long long a[100005],M;
inline void build(int l,int r,int p){
t[p].add=0,t[p].mul=1;
if(l==r){t[p].num=a[l]%M;return;}
int mid=(l+r)/2;
build(l,mid,p*2);
build(mid+1,r,p*2+1);
t[p].num=(t[p*2].num+t[p*2+1].num)%M;
}
inline void pushdown(int l,int r,int p){
int mid=(l+r)/2;
t[p*2].num=(t[p*2].num*t[p].mul+(mid-l+1)*t[p].add)%M;
t[p*2+1].num=(t[p*2+1].num*t[p].mul+(r-mid)*t[p].add)%M;
t[p*2].mul=(t[p*2].mul*t[p].mul)%M;
t[p*2+1].mul=(t[p*2+1].mul*t[p].mul)%M;
t[p*2].add=(t[p*2].add*t[p].mul+t[p].add)%M;
t[p*2+1].add=(t[p*2+1].add*t[p].mul+t[p].add)%M;
t[p].mul=1,t[p].add=0;
}
inline void update1(int l,int r,int x,int y,long long k,int p){
if(x<=l&&r<=y){
t[p].num=(t[p].num*k)%M;
t[p].mul=(t[p].mul*k)%M;
t[p].add=(t[p].add*k)%M;
return;
}
pushdown(l,r,p);
int mid=(l+r)/2;
if(x<=mid) update1(l,mid,x,y,k,p*2);
if(y>mid) update1(mid+1,r,x,y,k,p*2+1);
t[p].num=(t[p*2].num+t[p*2+1].num)%M;
}
inline void update2(int l,int r,int x,int y,long long k,int p){
if(x<=l&&r<=y){
t[p].num=(t[p].num+(r-l+1)*k)%M;
t[p].add=(t[p].add+k)%M;
return;
}
pushdown(l,r,p);
int mid=(l+r)/2;
if(x<=mid) update2(l,mid,x,y,k,p*2);
if(y>mid) update2(mid+1,r,x,y,k,p*2+1);
t[p].num=(t[p*2].num+t[p*2+1].num)%M;
}
long long ask(int l,int r,int x,int y,int p){
if(x<=l&&r<=y) return t[p].num%M;
pushdown(l,r,p);
int mid=(l+r)/2;
long long sum=0;
if(x<=mid) sum+=ask(l,mid,x,y,p*2);
if(y>mid) sum+=ask(mid+1,r,x,y,p*2+1);
return sum%M;
}
int main(){
read(n),read(m),read(M);
for(int i=1;i<=n;++i) read(a[i]);
build(1,n,1);
/*
printf("%d %d\n",t[8].num,t[9].num);
printf("%d\n",t[8].num),printf("%d\n",t[9].num);
put(t[8].num),pc,put(t[9].num),pc,put(t[5].num),pc,put(t[6].num),pc,put(t[7].num),pt;
就是这串毒瘤代码*/
int op,x,y;
long long k;
for(int i=1;i<=m;++i){
read(op),read(x),read(y);
if(op==3) put(ask(1,n,x,y,1)),pt;
else if(op==1) read(k),update1(1,n,x,y,k,1);
else read(k),update2(1,n,x,y,k,1);
}
}
那串毒瘤代码的输出是这样的:
1 | 0 |
---|---|
1 | |
5 | |
1 | 5 |
而原本t[8]存的就是1,t[9]存的就是5,但是那个printf将两个一起输出却变成了1 0,分开输就是对的。搞不懂为什么。