This documentation is automatically generated by online-judge-tools/verification-helper
#define PROBLEM "https://judge.yosupo.jp/problem/range_affine_range_sum"
#include "../../library/contest/template-minimal.hpp"
#include "../../library/modular-arithmetic/mod-int2.hpp"
#include "../../library/data-structures/1d-range-queries/affine-segment-tree.hpp"
using mi = Mint<998244353, 5>;
int main() {
cin.tie(0)->sync_with_stdio(false);
int n, q;
AffineSegmentTree<mi> seg;
cin >> n >> q;
seg.init(n);
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
seg.upd(0, i, i, a[i]);
}
while (q--) {
int t;
cin >> t;
if (t == 0) {
int l, r, b, c;
cin >> l >> r >> b >> c;
seg.upd(1, l, r - 1, b);
seg.upd(0, l, r - 1, c);
} else {
int l, r;
cin >> l >> r;
cout << seg.qsum(l, r - 1) << '\n';
}
}
return 0;
}
#define PROBLEM "https://judge.yosupo.jp/problem/range_affine_range_sum"
#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <chrono>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <iostream>
#include <iomanip>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <vector>
using namespace std;
// 5 is a root of both mods
template <int MOD, int RT> struct Mint {
static const int mod = MOD;
static constexpr Mint rt() { return RT; } // primitive root for FFT
static constexpr int md() { return MOD; } // primitive root for FFT
int v;
explicit operator int() const { return v; } // explicit -> don't silently convert to int
explicit operator bool() const { return v != 0; }
Mint() { v = 0; }
Mint(long long _v) { v = int((-MOD <= _v && _v < MOD) ? _v : _v % MOD); if (v < 0) v += MOD; }
friend bool operator==(const Mint& a, const Mint& b) { return a.v == b.v; }
friend bool operator!=(const Mint& a, const Mint& b) { return !(a == b); }
friend bool operator<(const Mint& a, const Mint& b) { return a.v < b.v; }
friend bool operator>(const Mint& a, const Mint& b) { return a.v > b.v; }
friend bool operator<=(const Mint& a, const Mint& b) { return a.v <= b.v; }
friend bool operator>=(const Mint& a, const Mint& b) { return a.v >= b.v; }
friend std::istream& operator >> (std::istream& in, Mint& a) {
long long x; std::cin >> x; a = Mint(x); return in; }
friend std::ostream& operator << (std::ostream& os, const Mint& a) { return os << a.v; }
Mint& operator+=(const Mint& m) {
if ((v += m.v) >= MOD) v -= MOD;
return *this; }
Mint& operator-=(const Mint& m) {
if ((v -= m.v) < 0) v += MOD;
return *this; }
Mint& operator*=(const Mint& m) {
v = (long long)v * m.v % MOD; return *this; }
Mint& operator/=(const Mint& m) { return (*this) *= inv(m); }
friend Mint pow(Mint a, long long p) {
Mint ans = 1; assert(p >= 0);
for (; p; p /= 2, a *= a) if (p & 1) ans *= a;
return ans;
}
friend Mint inv(const Mint& a) { assert(a.v != 0); return pow(a, MOD - 2); }
Mint operator-() const { return Mint(-v); }
Mint& operator++() { return *this += 1; }
Mint& operator--() { return *this -= 1; }
friend Mint operator+(Mint a, const Mint& b) { return a += b; }
friend Mint operator-(Mint a, const Mint& b) { return a -= b; }
friend Mint operator*(Mint a, const Mint& b) { return a *= b; }
friend Mint operator/(Mint a, const Mint& b) { return a /= b; }
};
template <class T> struct AffineSegmentTree {
int sz;
std::vector<T> sum, mult, add;
void push(int ind, int L, int R) { // modify values for current node
sum[ind] *= mult[ind]; sum[ind] += (R - L + 1) * add[ind];
if (L != R) {
mult[2 * ind] *= mult[ind]; mult[2 * ind + 1] *= mult[ind];
add[2 * ind] *= mult[ind]; add[2 * ind] += add[ind];
add[2 * ind + 1] *= mult[ind]; add[2 * ind + 1] += add[ind];
}
add[ind] = 0; mult[ind] = 1;
}
void init(int n) {
sz = 1;
while (sz < n) sz *= 2;
mult.assign(2 * sz, 1);
sum.assign(2 * sz, 0);
add.assign(2 * sz, 0);
}
void pull(int ind) {
sum[ind] = sum[2 * ind] + sum[2 * ind + 1];
}
// t == 0 is add, t == 1 is for multiplying
void upd(int t, int lo, int hi, T inc, int ind = 1, int L = 0, int R = -1) {
if (R == -1) R += sz;
push(ind, L, R);
if (hi < L || R < lo) return;
if (lo <= L && R <= hi) {
if(t == 0) add[ind] = inc;
else mult[ind] = inc;
push(ind, L, R); return;
}
int M = (L + R) / 2;
upd(t, lo, hi, inc, 2 * ind, L, M); upd(t, lo, hi, inc, 2 * ind + 1, M + 1, R);
pull(ind);
}
T qsum(int lo, int hi, int ind = 1, int L = 0, int R = -1) {
if (R == -1) R += sz;
push(ind, L, R);
if (lo > R || L > hi) return 0;
if (lo <= L && R <= hi) return sum[ind];
int M = (L + R) / 2;
return qsum(lo, hi, 2 * ind, L, M) + qsum(lo, hi, 2 * ind + 1, M + 1, R);
}
};
using mi = Mint<998244353, 5>;
int main() {
cin.tie(0)->sync_with_stdio(false);
int n, q;
AffineSegmentTree<mi> seg;
cin >> n >> q;
seg.init(n);
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
seg.upd(0, i, i, a[i]);
}
while (q--) {
int t;
cin >> t;
if (t == 0) {
int l, r, b, c;
cin >> l >> r >> b >> c;
seg.upd(1, l, r - 1, b);
seg.upd(0, l, r - 1, c);
} else {
int l, r;
cin >> l >> r;
cout << seg.qsum(l, r - 1) << '\n';
}
}
return 0;
}