人傻常数大。。。连这种题都过不了。。。
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long ll;
const int N = (1e6)*4;
int p;
int read(){
int x=0;
char ch;
do ch=getchar();while (ch<'0'||ch>'9');
while (ch>='0' && ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x;
}
void print(ll x) {
if(x < 0) putchar('-'), x = -x;
if(x > 9) print(x / 10);
putchar(x % 10 + '0');
}
int data[N];ll val[N];ll add[N],mul[N];
void pushdown(int now,int l,int r) {
int l1 = now<<1,l2 = now<<1|1,mid = (l+r)>>1;
int lenl = mid-l+1,lenr = r-(mid+1)+1;
val[l1] = (mul[now] * val[l1]%p + //计算mul的贡献
(add[now]%p * lenl%p)%p)%p;//add的
val[l2] = (mul[now] * val[l2]%p +
(add[now]%p * lenr%p)%p)%p;
add[l1] = (add[l1] * mul[now]%p + add[now])%p;
add[l2] = (add[l2] * mul[now]%p + add[now])%p;
mul[l1] = (mul[now]%p * mul[l1]%p)%p;
mul[l2] = (mul[now]%p * mul[l2]%p)%p;
mul[now] = 1;
add[now] = 0;
}
void pushup(int now) {
val[now] = (val[now<<1]%p + val[now<<1|1]%p)%p;
}
void build(int l,int r,int now) {
mul[now] = 1;
add[now] = 0;
if(l == r) {
val[now] = data[l];
return ;
}
ll mid = (l+r)>>1;
build(l,mid,now<<1);
build(mid+1,r,now<<1|1);
pushup(now);
}
void change_mul(int l,int r,int x,int y,int now,int v) {
pushdown(now,l,r);
if(x <= l && r <= y) {
mul[now] = (mul[now]%p * v%p)%p;
add[now] = (add[now]%p * v%p)%p;
val[now] = (val[now]%p * v%p)%p;
return ;
}
ll mid = (l+r)>>1;
if(x <= mid)change_mul(l,mid,x,y,now<<1,v);
if(y >= mid+1)change_mul(mid+1,r,x,y,now<<1|1,v);
pushup(now);
}
void change_add(int l,int r,int x,int y,int now,int v) {
pushdown(now,l,r);
if(x <= l && r <= y) {
add[now] = (add[now]%p + v%p)%p;
val[now] = (val[now]%p + (r-l+1)*v%p)%p;
return ;
}
ll mid = (l+r)>>1;
if(x <= mid)change_add(l,mid,x,y,now<<1,v);
if(y >= mid+1)change_add(mid+1,r,x,y,now<<1|1,v);
pushup(now);
}
ll query(int l,int r,int x,int y,int now) {
pushdown(now,l,r);
if(x <= l && r <= y) {
return val[now];
}
int mid = (l+r)>>1;
int ans = 0;
if(x <= mid)ans = (ans%p + query(l,mid,x,y,now<<1)%p)%p;
if(y >= mid+1)ans = (ans%p + query(mid+1,r,x,y,now<<1|1)%p)%p;
return ans;
}
int main() {
int n,m;
n = read();p = read();
for(int i = 1; i <= n; i++)
data[i] = read();
build(1,n,1);
int op,x,y,k;
m = read();
while(m--) {
op = read();
if(op == 1) {
x = read(); y = read();k = read();
change_mul(1,n,x,y,1,k);
}
if(op == 2) {
x = read(); y = read();k = read();
change_add(1,n,x,y,1,k);
}
if(op == 3) {
x = read(); y = read();
print(query(1 , n , x , y , 1)%p);
puts("");
}
}
return 0;
}