#include #include #include using namespace std; using mint = atcoder::modint998244353; using S = pair; S op(S a, S b) { return { a.first + b.first, a.second + b.second }; } S e() { return S(0, 0); } S mapping(int a, S b) { return a == -1 ? b : S(mint(a) * b.second, b.second); } int composition(int a, int b) { return a == -1 ? b : a; } int id() { return -1; } vector> sg(5); mint prod(int type, const vector>& segs) { mint res(0); for (auto& s : segs) { res += sg[type].prod(s.first, s.second).first; } return res; } mint calc(int type, const vector>& segs) { mint s0 = prod(0, segs); mint s1 = prod(1, segs); mint m = s1 / s0; if (type == 1) { return (s1 - s0 * m) / s0; } else if (type == 2) { mint s2 = prod(2, segs); return (s2 - s1 * m * 2 + s0 * m * m) / s0; } else if (type == 3) { mint s2 = prod(2, segs); mint s3 = prod(3, segs); return (s3 - s2 * m * 3 + s1 * m * m * 3 - s0 * m * m * m) / s0; } else { mint s2 = prod(2, segs); mint s3 = prod(3, segs); mint s4 = prod(4, segs); return (s4 - s3 * m * 4 + s2 * m * m * 6 - s1 * m * m * m * 4 + s0 * m * m * m * m) / s0; } } int main() { cin.tie(0); ios::sync_with_stdio(0); int n; cin >> n; vector a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } vector a2(n, {1, 1}); for (int i = 0; i < 5; ++i) { sg[i] = atcoder::lazy_segtree(a2); for (int j = 0; j < n; ++j) { a2[j].first *= a[j]; } } int q; cin >> q; for (int _ = 0; _ < q; ++_) { int t, u, v, w; cin >> t >> u >> v >> w; --u; --v; --w; vector> segs; if (u > v) swap(u, v); if (u < w && w < v) { segs.emplace_back(u, v + 1); } else { segs.emplace_back(v, n); segs.emplace_back(0, u + 1); } if (t == 0) { int b; cin >> b; mint mb(1); for (int i = 0; i < 5; ++i) { for (auto& s : segs) { sg[i].apply(s.first, s.second, mb.val()); } mb *= b; } } else { cout << calc(t, segs).val() << '\n'; } } return 0; }