#include using namespace std; #define ll long long #define pii pair #define pll pair #define vi vector #define vl vector #define ov4(a, b, c, d, name, ...) name #define rep3(i, a, b, c) for(ll i = (a); i < (b); i += (c)) #define rep2(i, a, b) rep3(i, a, b, 1) #define rep1(i, n) rep2(i, 0, n) #define rep0(n) rep1(aaaaa, n) #define rep(...) ov4(__VA_ARGS__, rep3, rep2, rep1, rep0)(__VA_ARGS__) #define per(i, a, b) for(ll i = (a)-1; i >= (b); i--) #define fore(e, v) for(auto&& e : v) #define all(a) begin(a), end(a) #define sz(a) (int)(a.size()) #define lb(v, x) (lower_bound(all(v), x) - begin(v)) #define eb emplace_back template bool chmin(T& a, const S& b) { return a > b ? a = b, 1 : 0; } template bool chmax(T& a, const S& b) { return a < b ? a = b, 1 : 0; } const int INF = 1e9 + 100; const ll INFL = 3e18 + 100; #define i128 __int128_t struct _ { _() { cin.tie(0)->sync_with_stdio(0), cout.tie(0); } } __; void debug(auto ...vs) { ((cerr << vs << " "), ...) << endl; } const int mod = 998244353; class mint { long long x; public: mint(long long x=0) : x((x%mod+mod)%mod) {} mint operator-() const { return mint(-x); } mint& operator+=(const mint& a) { if ((x += a.x) >= mod) x -= mod; return *this; } mint& operator-=(const mint& a) { if ((x += mod-a.x) >= mod) x -= mod; return *this; } mint& operator*=(const mint& a) { (x *= a.x) %= mod; return *this; } mint operator+(const mint& a) const { mint res(*this); return res+=a; } mint operator-(const mint& a) const { mint res(*this); return res-=a; } mint operator*(const mint& a) const { mint res(*this); return res*=a; } mint pow(ll t) const { if (!t) return 1; mint a = pow(t>>1); a *= a; if (t&1) a *= *this; return a; } // for prime mod mint inv() const { return pow(mod-2); } mint& operator/=(const mint& a) { return (*this) *= a.inv(); } mint operator/(const mint& a) const { mint res(*this); return res/=a; } friend ostream& operator<<(ostream& os, const mint& m){ os << m.x; return os; } }; int ceil_pow2(int n) { int x = 0; while ((1U << x) < (unsigned int)(n)) x++; return x; } template struct lazy_segtree { public: lazy_segtree() : lazy_segtree(0) {} explicit lazy_segtree(int n) : lazy_segtree(std::vector(n, e())) {} explicit lazy_segtree(const std::vector& v) : _n(int(v.size())) { log = ceil_pow2(_n); size = 1 << log; d = std::vector(2 * size, e()); lz = std::vector(size, id()); for (int i = 0; i < _n; i++) d[size + i] = v[i]; for (int i = size - 1; i >= 1; i--) { update(i); } } void set(int p, S x) { assert(0 <= p && p < _n); p += size; for (int i = log; i >= 1; i--) push(p >> i); d[p] = x; for (int i = 1; i <= log; i++) update(p >> i); } S get(int p) { assert(0 <= p && p < _n); p += size; for (int i = log; i >= 1; i--) push(p >> i); return d[p]; } S prod(int l, int r) { assert(0 <= l && l <= r && r <= _n); if (l == r) return e(); l += size; r += size; for (int i = log; i >= 1; i--) { if (((l >> i) << i) != l) push(l >> i); if (((r >> i) << i) != r) push((r - 1) >> i); } S sml = e(), smr = e(); while (l < r) { if (l & 1) sml = op(sml, d[l++]); if (r & 1) smr = op(d[--r], smr); l >>= 1; r >>= 1; } return op(sml, smr); } S all_prod() { return d[1]; } void apply(int p, F f) { assert(0 <= p && p < _n); p += size; for (int i = log; i >= 1; i--) push(p >> i); d[p] = mapping(f, d[p]); for (int i = 1; i <= log; i++) update(p >> i); } void apply(int l, int r, F f) { assert(0 <= l && l <= r && r <= _n); if (l == r) return; l += size; r += size; for (int i = log; i >= 1; i--) { if (((l >> i) << i) != l) push(l >> i); if (((r >> i) << i) != r) push((r - 1) >> i); } { int l2 = l, r2 = r; while (l < r) { if (l & 1) all_apply(l++, f); if (r & 1) all_apply(--r, f); l >>= 1; r >>= 1; } l = l2; r = r2; } for (int i = 1; i <= log; i++) { if (((l >> i) << i) != l) update(l >> i); if (((r >> i) << i) != r) update((r - 1) >> i); } } template int max_right(int l) { return max_right(l, [](S x) { return g(x); }); } template int max_right(int l, G g) { assert(0 <= l && l <= _n); assert(g(e())); if (l == _n) return _n; l += size; for (int i = log; i >= 1; i--) push(l >> i); S sm = e(); do { while (l % 2 == 0) l >>= 1; if (!g(op(sm, d[l]))) { while (l < size) { push(l); l = (2 * l); if (g(op(sm, d[l]))) { sm = op(sm, d[l]); l++; } } return l - size; } sm = op(sm, d[l]); l++; } while ((l & -l) != l); return _n; } template int min_left(int r) { return min_left(r, [](S x) { return g(x); }); } template int min_left(int r, G g) { assert(0 <= r && r <= _n); assert(g(e())); if (r == 0) return 0; r += size; for (int i = log; i >= 1; i--) push((r - 1) >> i); S sm = e(); do { r--; while (r > 1 && (r % 2)) r >>= 1; if (!g(op(d[r], sm))) { while (r < size) { push(r); r = (2 * r + 1); if (g(op(d[r], sm))) { sm = op(d[r], sm); r--; } } return r + 1 - size; } sm = op(d[r], sm); } while ((r & -r) != r); return 0; } void debug() { cout << "==================================" << endl; for(auto x:d)cout << x.max << " " << x.min << " " << x.len << " " << x.sum << endl; cout << "==================================" << endl; } private: int _n, size, log; std::vector d; std::vector lz; void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); } void all_apply(int k, F f) { d[k] = mapping(f, d[k]); if (k < size) { lz[k] = composition(f, lz[k]); if (d[k].fail) push(k), update(k); } } void push(int k) { all_apply(2 * k, lz[k]); all_apply(2 * k + 1, lz[k]); lz[k] = id(); } }; uint64_t kth_root(uint64_t N, uint64_t K = 2) { assert(K >= 1); if (N <= 1 || K == 1) return N; if (K >= 64) return 1; if (N == uint64_t(-1)) --N; auto mul = [&](uint64_t x, uint64_t y) -> uint64_t { if (x < UINT_MAX && y < UINT_MAX) return x * y; if (x == uint64_t(-1) || y == uint64_t(-1)) return uint64_t(-1); return (x <= uint64_t(-1) / y ? x * y : uint64_t(-1)); }; auto power = [&](uint64_t x, uint64_t k) -> uint64_t { if (k == 0) return 1ULL; uint64_t res = 1ULL; while (k) { if (k & 1) res = mul(res, x); x = mul(x, x); k >>= 1; } return res; }; uint64_t res; if (K == 2) res = sqrtl(N) - 1; else if (K == 3) res = cbrt(N) - 1; else res = pow(N, nextafter(1 / double(K), 0)); while (power(res + 1, K) <= N) ++res; return res; } const ll inf = 1e9; const int cntmax = 5; struct S{ ll max,min,len; ll sum; bool fail; S(ll max, ll min, ll len, ll sum, bool fail) :max(max),min(min),len(len),sum(sum),fail(0) {} }; S op(S l, S r) { ll x = max(l.max,r.max), y = min(l.min,r.min); bool fail = (x != y); return S(x,y,l.len+r.len,l.sum+r.sum, fail); } S e() { return S(-inf,inf,0,0,true); } struct F { ll cnt, val; F(ll cnt, ll val): cnt(cnt),val(val) {} }; // x <= X S mapping(F f, S s) { if (s.fail)return s; if (f.val != -1)return S(f.val,f.val,s.len,f.val*s.len,false); if(f.cnt==0){ s.fail = false; return s; } if(s.max == s.min) { ll zz = kth_root(s.max, 1 << f.cnt); return S(zz, zz, s.len, zz*s.len, false); } if(f.cnt > cntmax) {return S(1, 1, s.len, s.len, false);} S x = e(); x.fail = true; return x; } F composition(F f1, F f2) { if(f1.val != -1)return f1; if(f2.val != -1)return F(0, kth_root(f2.val, 1 << f1.cnt)); if (f1.cnt + f2.cnt > cntmax)return F(0, 1); return F(f1.cnt + f2.cnt,-1); } F id() { return F(0, -1); } struct S2 { ll len, sum; bool fail = false; }; S2 op(S2 x, S2 y) { return {x.len + y.len, x.sum + y.sum, false}; } S2 e2() { return {0, 0, false}; } S2 mapping(int f, S2 s) { if (f == -1) return s; else return {s.len, s.len * f, false}; } int composition(int f1, int f2) { if (f1 != -1) return f1; return f2; } int id2() { return -1; } void solve() { int n, q; cin >> n >> q; vi a(n);rep(i, n) cin >> a[i]; vector b; vector c; rep(i, n) { if (a[i] == 0) { b.emplace_back(S{1, 1, 1, 1, false}); c.emplace_back(S2{1, 1, false}); } else { b.emplace_back(S{a[i], a[i], 1, a[i], false}); c.emplace_back(S2{1, 0, false}); } } lazy_segtree lst(b); lazy_segtree lst2(c); rep(q) { // rep(i, n) cerr << lst.get(i).sum << " "; // cerr << endl; int t;cin >> t; if (t == 0) { int l, r; cin >> l >> r; cout << lst.prod(l, r).sum - lst2.prod(l, r).sum << endl; } else if (t == 1) { int l, r, x; cin >> l >> r >> x; if (x == 0) { lst.apply(l, r, F{0, 1}); lst2.apply(l, r, 1); } else { lst.apply(l, r, F{0, x}); lst2.apply(l, r, 0); } } else { int l, r;cin >> l >> r; lst.apply(l, r, F{1, -1}); } } } int main(){ int T = 1; // int T;cin >> T; while(T--) { solve(); } }