#include #include using namespace std; using ll = long long; using pii = pair; using pll = pair; using vi = vector; using vl = vector; #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 ov4(a, b, c, d, name, ...) name #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)(size(a)) #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); } } __; ll isqrt(ll v) { ll res = sqrt(v); while ((res + 1) * (res + 1) <= v) res += 1; return res; } struct isq_vec { array s; int len; }; isq_vec seg_op(isq_vec a, isq_vec b) { isq_vec res; res.len = a.len + b.len; rep(i, 6) res.s[i] = a.s[i] + b.s[i]; return res; } isq_vec seg_e() { return isq_vec{array{0, 0, 0, 0, 0, 0}, 0}; } isq_vec seg_map(pii f, isq_vec s) { if (f.first != -1) { s.s[0] = f.first; rep(i, 5) s.s[i + 1] = isqrt(s.s[i]); rep(i, 6) s.s[i] *= s.len; } rep(f.second) { rep(i, 5) { s.s[i] = s.s[i + 1]; } } return s; } pii seg_comp(pii f, pii g) { if (f.first != -1) { return f; } return pii{g.first, g.second + f.second}; } pii seg_id() { return pii{-1, 0}; } int main() { int N, Q; cin >> N >> Q; atcoder::lazy_segtree seg(N); rep(i, N) { ll x; cin >> x; isq_vec a; a.len = 1; a.s[0] = x; rep(i, 5) a.s[i + 1] = isqrt(a.s[i]); seg.set(i, a); } rep(Q) { int t; cin >> t; if (t == 0) { int L, R; cin >> L >> R; cout << seg.prod(L, R).s[0] << '\n'; } else if (t == 1) { int L, R, V; cin >> L >> R >> V; seg.apply(L, R, pii{V, 0}); } else { int L, R; cin >> L >> R; seg.apply(L, R, pii{-1, 1}); } } }