蒟蒻实在看不出来有什么问题,求调
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int n, q, m;
int t[N << 2], a[N], b[N], c[N];
int ls(int p) {return p << 1;}
int rs(int p) {return p << 1 | 1;}
void build(int l, int r, int p)
{
if(l == r)
{
t[p] = a[l] % m;
return;
}
int mid = l + r >> 1;
build(l, mid, ls(p));
build(mid + 1, r, rs(p));
t[p] = (t[ls(p)] + t[rs(p)]) % m;
}
void pushdown(int l, int r, int p)
{
int mid = l + r >> 1;
t[ls(p)] = (b[p] * t[ls(p)] + c[p] * (mid - l + 1)) % m;
t[rs(p)] = (b[p] * t[rs(p)] + c[p] * (r - mid)) % m;
b[ls(p)] = (b[ls(p)] * b[p]) % m;
b[rs(p)] = (b[rs(p)] * b[p]) % m;
c[ls(p)] = (c[ls(p)] * b[p] + c[p]) % m;
c[rs(p)] = (c[rs(p)] * b[p] + c[p]) % m;
b[p] = 1;
c[p] = 0;
t[p] = (t[ls(p)] + t[rs(p)]) % m;
}
void multi(int l, int r, int x, int y, int k, int p)
{
if(y < l || x > r) return;
if(x <= l && r <= y)
{
t[p] = (t[p] * k) % m;
b[p] = (b[p] * k) % m;
c[p] = (c[p] * k) % m;
return;
}
pushdown(l, r, p);
int mid = l + r >> 1;
multi(l, mid, x, y, k, ls(p));
multi(mid + 1, r, x, y, k, rs(p));
t[p] = (t[ls(p)] + t[rs(p)]) % m;
return;
}
void add(int l, int r, int x, int y, int k, int p)
{
if(y < l || x > r) return;
if(x <= l && r <= y)
{
c[p] = (c[p] + k) % m;
t[p] = (t[p] + k * (r - l + 1)) % m;
return;
}
pushdown(l, r, p);
int mid = l + r >> 1;
add(l, mid, x, y, k, ls(p));
add(mid + 1, r, x, y, k, rs(p));
t[p] = (t[ls(p)] + t[rs(p)]) % m;
return;
}
int query(int l, int r, int x, int y, int p)
{
if(y < l || x > r) return 0;
if(x <= l && r <= y)
{
return t[p];
}
pushdown(l, r, p);
int mid = l + r >> 1;
return (query(l, mid, x, y, ls(p)) + query(mid + 1, r, x, y, rs(p))) % m;
}
signed main()
{
cin >> n >> q >> m;
memset(b, 1, sizeof b);
for(int i = 1; i <= n; i++)
{
cin >> a[i];
}
build(1, n, 1);
while(q--)
{
int op;
cin >> op;
if(op == 1)
{
int x, y, k;
cin >> x >> y >> k;
multi(1, n, x, y, k, 1);
}
else if(op == 2)
{
int x, y, k;
cin >> x >> y >> k;
add(1, n, x, y, k, 1);
}
else
{
int x, y;
cin >> x >> y;
cout << query(1, n, x, y, 1) % m << endl;
}
}
}