这代码哪里有问题啊qwq
P3373,一道线段树模板
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,q,m;
const int maxn = 1e5+1;
int nod[maxn]; ll sum[maxn<<2]; int tag1[maxn<<2], tag2[maxn<<2];
void up(int n) {
sum[n] = sum[n<<1] + sum[n<<1|1];
}
void down(int l, int r, int n) {
int mid= (l + r) >>1;
tag1[n<<1] = tag1[n<<1] * (tag1[n] % m);
tag1[n<<1|1] = tag1[n<<1|1] * (tag1[n] % m);
tag2[n<<1] = tag2[n<<1] * tag1[n<<1] + tag2[n];
tag2[n<<1|1] = tag2[n<<1|1] * tag1[n<<1|1] + tag2[n];
sum[n<<1] = (sum[n<<1] * tag1[n<<1] + (mid - l+1) * tag2[n<<1]) % m;
sum[n<<1|1] = (sum[n<<1|1] * tag1[n<<1|1] + (mid - l+1) * tag2[n<<1|1]) % m;
tag1[n] = 1; tag2[n] = 0;
}
void build(int l , int r, int n) {
if(l == r) {
sum[n] = nod[l];
return;
}
int mid = ( l + r) >>1;
build(l, mid, n<<1);
build(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) {
tag1[n] *= k;
sum[n] = (sum[n] * tag1[n] + ( r- l+1) * k) % m;
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);
}
void add(int a, int b, int k ,int l ,int r, int n){
if(a <= l && r <= b) {
tag2[n] = tag2[n] * tag1[n] + k;
sum[n] = (sum[n] * tag1[n] + ( r- l+1) * tag2[n]) % m;
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);
}
ll ask(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; ll ans = 0;
if(mid>= a) ans += ask(a, b, l, mid ,n<<1);
if(mid < b) ans += ask(a, b, mid+1, r, n<<1|1);
}
void init() {
memset(tag2, 0, sizeof(tag2));
for(int i = 1; i <= (maxn<<2); i++) {
tag1[i] = 1;
}
}
int main () {
freopen("ask.in" ,"r", stdin);
//freopen("ask.out", "w", stdout);
init();
scanf("%d%d%d", &n, &q, &m);
for(int i = 1; i<= n;i++)
scanf("%d", &nod[i]);
build(1, n ,1);
while(q--) {
int a, b, mm, k;
scanf("%d%d%d", &mm, &a, &b);
if(mm ==1) {
scanf("%d", &k);
mul(a, b, k, 1, n, 1);
} if(mm ==2) {
scanf("%d", &k);
add(a, b, k, 1, n, 1);
} if(mm == 3){
ll anss = ask(a, b, 1, n, 1) % m;
printf("%lld\n", anss);
}
}
return 0;
}