```cpp
#include<iostream>
#include<cstdio>
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1
using namespace std;
typedef long long ll;
const int MAX = 100010;
int n, m, p, x;
ll a[MAX], tree[MAX<<2], col_mult[MAX<<2], col_add[MAX<<2];
void init() {
int i;
for (i = 1; i <= MAX<<2; i++)
col_mult[i] = 1;
return ;
}
void update(int rt) {
tree[rt] = (tree[rt<<1] + tree[rt<<1|1])%p;
return ;
}
void build(int l, int r, int rt) {
if (l == r) {
tree[rt] = a[l];
return ;
}
int mid = (l+r)>>1;
build(lson);
build(rson);
update(rt);
return ;
}
void color_add(int l, int r, int rt, ll v) {
tree[rt] = (tree[rt] + (r-l+1)*v)%p;
col_add[rt] = (col_add[rt] + v)%p;
return ;
}
void color_mult(int rt, ll v) {
tree[rt] = (tree[rt] * v)%p;
col_mult[rt] = (col_mult[rt] * v)%p;
col_add[rt] = (col_add[rt] * v)%p;
return ;
}
void push_col(int l, int r, int rt) {
if (col_mult[rt] != 1) {
color_mult(rt<<1, col_mult[rt]);
color_mult(rt<<1|1, col_mult[rt]);
col_mult[rt] = 1;
}
int mid = (l+r)>>1;
if (col_add[rt]) {
color_add(lson, col_add[rt]);
color_add(rson, col_add[rt]);
col_add[rt] = 0;
}
return ;
}
void modify(int l, int r, int rt, int nowl, int nowr, ll v) {
if (nowl <= l && nowr >= r) {
if (x == 1) {
color_mult(rt, v);
return ;
}
if (x == 2) {
color_add(l, r, rt, v);
return ;
}
}
int mid = (l+r)>>1;
push_col(l, r, rt);
if (nowl <= mid) modify(lson, nowl, nowr, v);
if (nowr > mid) modify(rson, nowl, nowr, v);
update(rt);
return ;
}
ll query(int l, int r, int rt, int nowl, int nowr) {
if (nowl <= l && nowr >= r) return tree[rt]%p;
int mid = (l+r)>>1;
push_col(l, r, rt);
if (nowl <= mid) {
if (nowr <= mid) return query(lson, nowl, nowr)%p;
else return (query(lson, nowl, nowr) + query(rson, nowl, nowr))%p;
}
else return query(rson, nowl, nowr)%p;
}
int main() {
init();
scanf("%d%d%d", &n, &m, &p);
int i;
for (i = 1; i <= n; i++)
scanf("%lld", &a[i]);
build(1, n, 1);
int nowl, nowr;
ll v;
for (i = 1; i <= m; i++) {
scanf("%d", &x);
if (x == 1) {
scanf("%d%d%d", &nowl, &nowr, &v);
modify(1, n, 1, nowl, nowr, v);
}
if (x == 2) {
scanf("%d%d%d", &nowl, &nowr, &v);
modify(1, n, 1, nowl, nowr, v);
}
if (x == 3) {
scanf("%d%d", &nowl, &nowr);
printf("%lld\n", query(1, n, 1, nowl, nowr)%p);
}
}
return 0;
}
```
by 公元某年的猫 @ 2018-03-11 12:55:43
样例都过不了
by 公元某年的猫 @ 2018-03-11 12:56:28
这只能说明数据弱
by _LiM @ 2018-03-11 13:18:43