rt,30pts,AC#1#3#4,经检测不是longlong和mod的问题
code:
# include <bits/stdc++.h>
# define ffor(i,name) \
for (auto i = name.begin (); i != name.end (); ++ i)
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
int n, m, a[100005], op, x, y;
ll sum[400005], lazy1[400005], lazy2[400005], mod, k;
void pushdown (int x, int mid, int l, int r, int L, int R) {
// cout << l << '~' << r << ':' << lazy2[x] << '\n';
lazy2[L] *= lazy2[x];
lazy2[R] *= lazy2[x];
sum[L] *= lazy2[x];
sum[R] *= lazy2[x];
lazy2[x] = 1;
sum[L] %= mod, sum[R] %= mod;
lazy2[L] %= mod, lazy2[R] %= mod;
// cout << l << '~' << r << ':' << lazy2[x] << '\n';
lazy1[L] += lazy1[x];
lazy1[R] += lazy1[x];
sum[L] += lazy1[x] * (mid - l + 1);
sum[R] += lazy1[x] * (r - mid);
lazy1[x] = 0;
sum[L] %= mod, sum[R] %= mod;
lazy1[L] %= mod, lazy1[R] %= mod;
// cout << l << '~' << r << ':' << lazy2[x] << '\n';
return ;
}
void build_tree (int x, int l, int r) {
lazy2[x] = 1;
if (l == r) {
sum[x] = a[l] % mod;
// cout << l << ' ' << lazy2[x] << '\n';
return ;
}
int mid = l + r >> 1, L = x << 1, R = L ^ 1;
build_tree (L, l, mid), build_tree (R, mid + 1, r);
sum[x] = (sum[L] + sum[R]) % mod;
return ;
}
void tamper1 (int now, int l, int r, int x, int y) {
if (l == x && r == y) {
lazy2[now] *= k, sum[now] *= k, lazy1[now] *= k;
sum[now] %= mod, lazy2[now] %= mod, lazy1[now] %= mod;
// cout << now << ',' << l << '~' << r << ':' << sum[now] << '\n';
return ;
}
int mid = l + r >> 1, L = now << 1, R = L ^ 1;
// cout << "tamper1:" << now << ':' << lazy2[now] << '\n';
pushdown (now, mid, l, r, L, R);
if (mid >= y)
tamper1 (L, l, mid, x, y);
else if (mid < x)
tamper1 (R, mid + 1, r, x, y);
else
tamper1 (L, l, mid, x, mid), tamper1 (R, mid + 1, r, mid + 1, y);
sum[now] = (sum[L] + sum[R]) % mod;
// cout << l << '~' << r << ':' << sum[L] << '+' << sum[R] << '=' << sum[now] << '\n';
return ;
}
void tamper2 (int now, int l, int r, int x, int y) {
// cout << l << ' ' << r << ':' << lazy1[now] << ' ' << sum[now] << '\n';
if (l == x && r == y) {
sum[now] += k * (r - l + 1);
lazy1[now] += k;
sum[now] %= mod;
lazy1[now] %= mod;
// cout << l << ' ' << r << ':' << lazy1[now] << ' ' << sum[now] << '\n';
return ;
}
int mid = l + r >> 1, L = now << 1, R = L ^ 1;
// cout << "tamper2:" << now << ':' << lazy2[now] << '\n';
pushdown (now, mid, l, r, L, R);
if (mid >= y)
tamper2 (L, l, mid, x, y);
else if (mid < x)
tamper2 (R, mid + 1, r, x, y);
else
tamper2 (L, l, mid, x, mid), tamper2 (R, mid + 1, r, mid + 1, y);
sum[now] = (sum[L] + sum[R]) % mod;
// cout << l << ' ' << r << ':' << sum[L] << '+' << sum[R] << '=' << sum[now] << '\n';
return ;
}
ll find (int now, int l, int r, int x, int y) {
// cout << l << '~' << r << ':' << sum[now] << '\n';
if (l == x && r == y)
return sum[now];
int mid = l + r >> 1, L = now << 1, R = L ^ 1;
// cout << "find:" << now << ':' << lazy2[now] << '\n';
pushdown (now, mid, l, r, L, R);
if (mid >= y)
return find (L, l, mid, x, y);
if (mid < x)
return find (R, mid + 1, r, x, y);
return (find (L, l, mid, x, mid) + find (R, mid + 1, r, mid + 1, y)) % mod;
}
int main () {
// freopen ("big_sample.in", "r", stdin);
// freopen ("big_sample.out", "w", stdout);
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> n >> m >> mod;
for (int i = 1; i <= n; ++ i)
cin >> a[i];
build_tree (1, 1, n);
while (m --) {
cin >> op >> x >> y;
if (op < 2)
cin >> k, k %= mod, tamper1 (1, 1, n, x, y);
else if (op < 3)
cin >> k, k %= mod, tamper2 (1, 1, n, x, y);
else
cout << find (1, 1, n, x, y) << '\n';
}
return 0;
}