所有没过的点都是WrongAnswer,所有错误的原因都是answer too short on line 330.
#include<vector>
using namespace std;
long long n, q, m;
class MultiOPSegmentTree {
private:
vector<long long>seg_node;
vector<long long>lazy_mul;
vector<long long>lazy_add;
void update(long long p) {
seg_node[p] = (seg_node[p << 1] + seg_node[p << 1 | 1]) % m;
}
void build(long long l, long long r, long long p) {
if (l == r) {
seg_node[p] = arr[l];
lazy_add[p] = 0;
lazy_mul[p] = 1;
return;
}
long long mid = (l + r) >> 1;
build(l, mid, p << 1);
build(mid + 1, r, p << 1 | 1);
lazy_add[p] = 0;
lazy_mul[p] = 1;
update(p);
return;
}
void push_down(long long l, long long r, long long p) {
long long mid = (l + r) >> 1;
seg_node[p << 1] = (seg_node[p << 1] * lazy_mul[p] + lazy_add[p] * (mid - l + 1)) % m;
lazy_mul[p << 1] = (lazy_mul[p << 1] * lazy_mul[p]) % m;
lazy_add[p << 1] = (lazy_add[p << 1] * lazy_mul[p] + lazy_add[p]) % m;
seg_node[p << 1 | 1] = (seg_node[p << 1 | 1] * lazy_mul[p] + lazy_add[p] * (r - mid)) % m;
lazy_mul[p << 1 | 1] = (lazy_mul[p << 1 | 1] * lazy_mul[p]) % m;
lazy_add[p << 1 | 1] = (lazy_add[p << 1 | 1] * lazy_mul[p] + lazy_add[p]) % m;
lazy_add[p] = 0;
lazy_mul[p] = 1;
return;
}
void mul(long long l, long long r, long long p, long long x, long long y, long long k) {
if (l >= x && r <= y) {
lazy_mul[p] = (lazy_mul[p] * k) % m;
lazy_add[p] = (lazy_add[p] * k) % m;
seg_node[p] = (seg_node[p] * k) % m;
return;
}
push_down(l,r,p);
long long mid = (l + r) >> 1;
if (mid >= x) mul(l, mid, p << 1, x, y, k);
if (mid < y) mul(mid + 1, r, p << 1 | 1, x, y, k);
update(p);
return;
}
void add(long long l, long long r, long long p, long long x, long long y, long long k) {
if(l >= x && r <= y) {
lazy_add[p] = (lazy_add[p] + k) % m;
seg_node[p] = (seg_node[p] + k * (r - l + 1)) % m;
return;
}
push_down(l, r, p);
long long mid = (l + r) >> 1;
if (mid >= x) add(l, mid, p << 1, x, y, k);
if (mid < y) add(mid + 1, r, p << 1 | 1, x, y, k);
update(p);
return;
}
long long query(long long l, long long r, long long p, long long x, long long y) {
if (l >= x && r <= y) {
return seg_node[p];
}
push_down(l, r, p);
long long ans = 0;
long long mid = (l + r) >> 1;
if (mid >= x) ans = (ans + query(l, mid, p << 1, x, y)) % m;
if (mid < y) ans = (ans + query(mid + 1, r, p << 1 | 1, x, y)) % m;
return ans;
}
public:
MultiOPSegmentTree() {
long long size = n + 1;
arr.resize(size);
seg_node.resize(size << 2);
lazy_mul.resize(size << 2);
lazy_add.resize(size << 2);
}
vector<long long>arr;
void build() {
build(1, n, 1);
}
void mul(long long x, long long y, long long k) {
mul(1, n, 1, x, y, k);
return;
}
void add(long long x, long long y, long long k) {
add(1, n, 1, x, y, k);
return;
}
long long query(long long x, long long y) {
return query(1, n, 1, x, y);
}
};
int main() {
long long op, x, y, k;
cin >> n >> q >> m;
MultiOPSegmentTree tr;
for (long long i = 1; i <= n; i++)
cin >> tr.arr[i];
tr.build();
for (long long i = 1; i <= n; i++) {
cin >> op;
switch (op) {
case(1)://mul
cin >> x >> y >> k;
tr.mul(x, y, k);
break;
case(2):///add
cin >> x >> y >> k;
tr.add(x, y, k);
break;
case(3):
cin >> x >> y;
cout << tr.query(x, y) << endl;
break;
}
}
}