#include <bits/stdc++.h>
using namespace std;
const int N = 50000 + 7;
const int S = sqrt(N) + 5;
int n, block_len, s;
int bg[S], ed[S], loc[N];
long long a[N], sum[S], add[S];
void modify(int l, int r, int c) {
if (loc[l] == loc[r]) {
for (int i = l; i <= r; i++) a[i] += c;
sum[loc[l]] += c * (r - l + 1);
} else {
for (int i = loc[l] + 1; i <= loc[r] - 1; i++) add[i] += c;
for (int i = l; i <= ed[loc[l]]; i++) a[i] += c;
sum[loc[l]] += c * (ed[loc[l]] - l + 1);
for (int i = bg[loc[r]]; i <= r; i++) a[i] += c;
sum[loc[r]] += c * (r - bg[loc[r]] + 1);
}
return;
}
long long query(int l, int r, int c) {
long long ans = 0;
c++;
if (loc[l] == loc[r]) {
for (int i = l; i <= r; i++) ans = (ans + a[i]) % c;
ans = (ans + add[loc[l]] * (r - l + 1)) % c;
} else {
for (int i = loc[l] + 1; i <= loc[r] - 1; i++) ans = (ans + sum[i] + add[i] * (ed[i] - bg[i] + 1)) % c;
for (int i = l; i <= ed[loc[l]]; i++) ans = (ans + a[i]) % c;
ans = (ans + add[loc[l]] * (ed[loc[l]] - l + 1)) % c;
for (int i = bg[loc[r]]; i <= r; i++) ans = (ans + a[i]) % c;
ans = (ans + add[loc[r]] * (r - bg[loc[r]] + 1)) % c;
}
return ans % c;
}
int main() {
cin >> n;
block_len = sqrt(n);
s = n / block_len;
for (int i = 1; i <= s; i++) {
bg[i] = (i - 1) * block_len + 1;
ed[i] = i * block_len;
}
ed[s] = n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
loc[i] = ceil(1.000 * i / block_len);
}
memset(sum, 0, sizeof(sum));
memset(add, 0, sizeof(add));
for (int i = 1; i <= s; i++) {
for (int j = bg[i]; j <= ed[i]; j++) {
sum[i] += a[j];
}
}
int m = n;
int opt, l, r, c;
while (m--) {
cin >> opt >> l >> r >> c;
if (opt == 0) {
modify(l, r, c);
}
if (opt == 1) {
cout << query(l, r, c) << '\n';
}
}
return 0;
}
题目。
我瞪不出来了。。。