rt;为什么这个线段树模板题回答是错的????!!!!
不会要AFO了把
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+1;
int n, m, p;
long long sum[maxn << 2];
int tag1[maxn << 2], tag2[maxn << 2];
long long node[maxn];
void up(int n) {
sum[n] = (sum[n << 1] % p) + (sum[n <<1|1] % p);
}
void down(int l, int r, int n) {
int mid = (l +r) >>1;
if(tag2[n] != 1 || tag1[n]) {
tag2[n<<1] = tag2[n << 1|1] = tag2[n];
tag1[n << 1] = ( tag1[n <<1] * ( tag2[n] % p ) + tag1[n] % p) %p;
tag1[n<< 1|1] = (tag1[n<< 1|1] * (tag2[n] % p ) + tag1[n] % p) %p;
sum[n << 1] = sum[n << 1] * tag2[n] + (mid - l +1) * tag1[n <<1];
sum[n << 1|1] = sum[n << 1|1] * tag2[n] + (r - mid ) * tag1[n<<1|1];
tag2[n] = 1;
tag1[n] = 0;
}
}
void build(int l, int r, int n) {
if(l == r){
sum[n] = (node[l] % p);
tag1[n] = 0;
tag2[n] = 1;
return;
}
int mid = (l + r) >>1;
build(l, mid, n<<1);
build(mid +1, r, n<<1|1);
up(n);
}
void add(int a, int b, int k, int l, int r, int n) {
if(a <= l && r <= b) {
tag1[n] += k % p;
sum[n] += (r - l +1) *k %p;
return;
}
down(l, r, n);
int mid = (l +r) >>1;
if(mid >= a) add(a, b, k, l, mid, n<<1);
if(mid < b) add(a, b, k, mid+1, r, n<<1|1);
up(n);
}
void mul(int a, int b, int k, int l, int r, int n ){
if(a <= l && r <= b) {
tag2[n] = tag2[n] * (k % p) %p;
tag1[n] *= k %p;
sum[n] = (sum[n] % p) * (k % p);
return;
}
down(l, r, n);
int mid = (l +r) >>1;
if(mid >= a) mul(a, b, k, l, mid, n<<1);
if(mid < b) mul(a, b, k, mid+1, r, n<<1|1);
up(n);
}
long long query(int a, int b, int l, int r, int n) {
if(a <= l && r <= b) {
return sum[n];
}
down(l, r, n);
int mid = ( l+ r )>>1;
long long ans = 0;
if(mid >= a) ans += (query(a, b, l, mid, n<<1) % p) %p;
if(mid < b) ans += (query(a, b, mid+1, r, n<<1|1) % p) %p;
return ans;
}
int main() {
scanf("%d%d", &n, &m);
scanf("%d", &p);
for(int i = 1;i<= n;i++)
scanf("%lld", &node[i]);
build(1, n, 1);
int a, b, k, mode;
while(m--) {
scanf("%d", &mode);
if(mode == 1){
scanf("%d%d%d", &a, &b, &k);
add(a, b , k, 1, n, 1);
}
else if(mode == 2) {
scanf("%d%d%d", &a, &b, &k);
mul(a, b , k, 1, n, 1);
}
else {
scanf("%d%d", &a, &b);
long long ans = query(a, b, 1, n, 1) % p;
printf("%lld\n", ans);
}
}
return 0;
}