rt,过样例但 0 分。
#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
ll a[101010], sum[101010], tag[101010], id[101010], siz[101010], q[101010];
int main() {
ios::sync_with_stdio(0);
cin.tie(nullptr);
cout.tie(nullptr);
int n, len = 0, kc;
cin >> n;
kc = sqrt(n);
for (int i = 1; i <= n; ++i) {
cin >> a[i];
if ((i - 1) % kc == 0) {
siz[len] = kc;
++len;
}
id[i] = len;
sum[len] += a[i];
}
id[n+1] = len+1;
siz[0] = 0;
siz[len] = n % kc ? n % kc : kc;
for (int i = 1; i <= len; ++i) q[i] = q[i-1] + siz[i];
auto update = [&](ll l, ll r, ll c) -> void {
int L = id[l - 1] + 1, R = id[r + 1] - 1;
for (int i = L; i <= R; ++i) {
tag[i] += c;
sum[i] += c * siz[i];
}
for (int i = q[L - 1]; i >= l; --i) {
sum[id[i]] += c;
a[i] += c;
}
for (int i = q[R] + 1; i <= r; ++i) {
sum[id[i]] += c;
a[i] += c;
}
};
auto getsum = [&](ll l, ll r, ll c) -> ll {
int L = id[l - 1] + 1, R = id[r + 1] - 1;
ll ans = 0;
for (int i = L; i <= R; ++i) ans += sum[i];
for (int i = q[L - 1]; i >= l; --i) {
ans += a[i] + tag[id[i]];
}
for (int i = q[R] + 1; i <= r; ++i) {
ans += a[i] + tag[id[i]];
}
return ans;
};
while (n--) {
ll opt, l, r, c;
cin >> opt >> l >> r >> c;
if (opt == 0) update(l, r, c);
else {
cout << getsum(l, r, c) % (c + 1) << '\n';
}
}
return 0;
}