开4倍会RE三个点,但是我看绝大多数人都是开的四倍,应该是我哪里写的有点问题,但是我找不出来,肯求大佬解惑
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<stack>
#include<set>
#define NDEBUG
#include <assert.h>
using namespace std;
typedef vector<int> vi;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9') {
if(ch == '-') f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * f;
}
#define endl '\n'
#define rd read()
#define pb push_back
#define mst(a, b) memset((a), (b), sizeof(a));
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3f
#define maxn 100005
#define ls (u << 1)
#define rs (u << 1 | 1)
int n, m, k, mod;
struct tree {
ll x, lazym = 1, lazya;
} t[maxn << 3];
void pushup(int u) {
t[u].x = t[ls].x + t[rs].x;
}
void build(int u, int l, int r) {
if(l == r) {t[u].x = rd; return;}
int mid = (l + r) >> 1;
build(ls, l, mid);
build(rs, mid + 1, r);
pushup(u);
}
void pushdown(int u, int l, int r) {
int mid = (l + r) >> 1;
t[ls].x = (t[u].lazym * t[ls].x + (ll)t[u].lazya * (mid - l + 1)) % mod;
t[rs].x = (t[u].lazym * t[rs].x + (ll)t[u].lazya * (r - mid)) % mod;
t[ls].lazym = t[ls].lazym * t[u].lazym % mod;
t[rs].lazym = t[rs].lazym * t[u].lazym % mod;
t[ls].lazya = (t[ls].lazya * t[u].lazym % mod + t[u].lazya) % mod;
t[rs].lazya = (t[rs].lazya * t[u].lazym % mod + t[u].lazya) % mod;
t[u].lazym = 1, t[u].lazya = 0;
}
void upd1(int u, int l, int r, int x, int y, int d) {
if(x <= l && r <= y) {
if(t[u].lazya) pushdown(u, l, r);
t[u].x = (t[u].x * d) % mod;
t[u].lazym = (t[u].lazym * d) % mod;
return;
}
pushdown(u, l, r);
int mid = (l + r) >> 1;
if(x <= mid) upd1(ls, l, mid, x, y, d);
if(y > mid) upd1(rs, mid + 1, r, x, y, d);
pushup(u);
}
void upd2(int u, int l, int r, int x, int y, int d) {
if(x <= l && r <= y) {
t[u].x = (t[u].x + (ll)d * (r - l + 1) % mod) % mod;
t[u].lazya = (t[u].lazya + d) % mod;
return;
}
pushdown(u, l, r);
int mid = (l + r) >> 1;
if(x <= mid) upd2(ls, l, mid, x, y, d);
if(y > mid) upd2(rs, mid + 1, r, x, y, d);
pushup(u);
}
ll query(int u, int l, int r, int x, int y) {
if(x <= l && r <= y) return t[u].x;
pushdown(u, l, r);
ll t1 = 0, t2 = 0;
int mid = (l + r) >> 1;
if(x <= mid) t1 = query(ls, l, mid, x, y);
if(y > mid) t2 = query(rs, mid + 1, r, x, y);
return (t1 + t2) % mod;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("D:\\Chrome Downloadings\\input.txt", "r", stdin);
freopen("D:\\Chrome Downloadings\\output.txt", "w", stdout);
#endif
cin >> n >> m >> mod;
build(1, 1, n);
while(m--) {
int op = rd, p = rd, q = rd;
if(op == 1) {
int k = rd;
upd1(1, 1, n, p, q, k);
} else if(op == 2) {
int k = rd;
upd2(1, 1, n, p, q, k);
} else if(op == 3) {
printf("%lld\n", query(1, 1, n, p, q));
}
}
return 0;
}