1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 int read(){
5 int x=0,f=1;
6 char c=getchar();
7 while(!isdigit(c)){
8 if(c=='-') f=-1;
9 c=getchar();
10 }
11 while(isdigit(c)){
12 x=(x<<1)+(x<<3)+(c^48);
13 c=getchar();
14 }
15 return x*f;
16 }
17 const int N=1e5+10;
18 int n,m,p;
19 int a[N];
20 struct tree{
21 ll sum[N<<2];
22 ll add[N<<2],mul[N<<2];
23 int ls(int o){return o<<1;}
24 int rs(int o){return o<<1|1;}
25 void pushup(int o){
26 sum[o]=(sum[ls(o)]+sum[rs(o)])%p;
27 }
28 void pushdown(int o,int l,int r){
29 int mid=(l+r)>>1;
30 sum[ls(o)]=(sum[ls(o)]*mul[o]+add[o]*(mid-l+1))%p;
31 sum[rs(o)]=(sum[rs(o)]*mul[o]+add[o]*(r - mid))%p;
32 mul[ls(o)]=(mul[ls(o)]*mul[o])%p;
33 mul[rs(o)]=(mul[rs(o)]*mul[o])%p;
34 add[ls(o)]=(add[ls(o)]*mul[o]+add[o])%p;
35 add[rs(o)]=(add[rs(o)]*mul[o]+add[o])%p;
36 mul[o]=1;add[o]=0;
37 }
38 void build(int o,int l,int r){
39 add[o]=0,mul[o]=1;
40 if(l==r){
41 sum[o]=a[l];
42 return;
43 }
44 int mid=(l+r)>>1;
45 build(ls(o),l,mid);
46 build(rs(o),mid+1,r);
47 pushup(o);
48 }
49 void multi(int o,int l,int r,int x,int y,ll k){
50 if(l>y||r<x) return;
51 if(l>=x&&r<=y){
52 sum[o]=(sum[o]*k)%p;
53 add[o]=(add[o]*k)%p;
54 mul[o]=(mul[o]*k)%p;
55 return;
56 }
57 int mid=(l+r)>>1;
58 pushdown(o,l,r);
59 if(x<=mid) multi(ls(o),l,mid,x,y,k);
60 if(r>mid) multi(rs(o),mid+1,r,x,y,k);
61 pushup(o);
62 }
63 void plus(int o,int l,int r,int x,int y,ll k){
64 if(l>y||r<x) return;
65 if(l>=x&&r<=y){
66 sum[o]=(sum[o]+k*(r-l+1))%p;
67 add[o]=(add[o]+k)%p;
68 return;
69 }
70 int mid=(l+r)>>1;
71 pushdown(o,l,r);
72 if(x<=mid) plus(ls(o),l,mid,x,y,k);
73 if(r>mid) plus(rs(o),mid+1,r,x,y,k);
74 pushup(o);
75 }
76 ll query(int o,int l,int r,int x,int y){
77 if(l>y||r<x) return 0;
78 if(l>=x&&r<=y){
79 return sum[o];
80 }
81 int mid=(l+r)>>1;
82 pushdown(o,l,r);
83 return (query(rs(o),mid+1,r,x,y)+query(ls(o),l,mid,x,y))%p;
84 }
85 }t;
86 int main(){
87 n=read();p=read();
88 for(int i=1;i<=n;i++){
89 a[i]=read();
90 }
91 m=read();
92 t.build(1,1,n);
93 int num,x,y;
94 ll k;
95 for(int i=1;i<=m;i++){
96 num=read();x=read();y=read();
97 if(num==1){
98 k=read();
99 t.multi(1,1,n,x,y,k);
100 }
101 else if(num==2){
102 k=read();
103 t.plus(1,1,n,x,y,k);
104 }
105 else{
106 printf("%lld\n",t.query(1,1,n,x,y));
107 }
108 }
109 return 0;
110 }
用我优美的能看的过去的代码格式打一份板子放这了。