你在玩一个游戏,主持人给了你一个长度为 n 的序列 A,然后对这序列进行了 m 次操作或询问 :
#include <bits/stdc++.h>
using namespace std;
const int N = 100000 + 7;
const int T = N * 4;
int a[N], sum[T];
int n, m, p;
void pushup(int rt) {
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
void build(int l, int r, int rt) {
if(l == r) {
sum[rt] = a[l];
return;
}
int mid = l + r >> 1;
build(l, mid, rt << 1);
build(mid + 1, r, rt << 1 | 1);
pushup(rt);
}
void update1(int L, int R, int C, int l, int r, int rt) {
if(L <= l && r <= R) {
sum[rt] = C;
return;
}
int mid = l + r >> 1;
if(L <= mid) update1(L, R, C, l, mid, rt << 1);
else update1(L, R, C, mid + 1, r, rt << 1 | 1);
pushup(rt);
}
void update2(int L, int R, int C, int l, int r, int rt) {
if(L <= l && r <= R) {
sum[rt] += C;
return;
}
int mid = l + r >> 1;
if(L <= mid) update2(L, R, C, l, mid, rt << 1);
else update2(L, R, C, mid + 1, r, rt << 1 | 1);
pushup(rt);
}
void update3(int L, int R, int C, int l, int r, int rt) {
if(L <= l && r <= R) {
sum[rt] *= C;
return;
}
int mid = l + r >> 1;
if(L <= mid) update3(L, R, C, l, mid, rt << 1);
else update3(L, R, C, mid + 1, r, rt << 1 | 1);
pushup(rt);
}
int query(int L, int R, int l, int r, int rt) {
if(L <= l && r <= R) return sum[rt];
int mid = l + r >> 1;
int ans = 0;
if(L <= mid) ans += query(L, R, l, mid, rt << 1) % p;
if(R > mid) ans += query(L, R, mid + 1, r, rt << 1 | 1) % p;
return ans % p;
}
int main() {
scanf("%d%d%d", &n, &m, &p);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
build(1, n, n);
while(m--) {
int c, l, r, x;
scanf("%d%d%d", &c, &l, &r);
if(c == 1) {
scanf("%d", &x);
update1(l, r, x, 1, n, n);
}
else if(c == 2) {
scanf("%d", &x);
update2(l, r, x, 1, n, n);
}
else if(c == 3) {
scanf("%d", &x);
update3(l, r, x, 1, n, n);
}
else printf("%d", query(l, r, 1, n, n));
}
return 0;
}
当输入 :
10 3 11
3 4 6 4 8 1 2 9 5 7
1 3 4 5
2 2 8 10
4 4 9
时,不应该输出 3 吗?