#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define overload4(_1,_2,_3,_4,name,...) name #define rep1(i,n) for (int i = 0; i < (n); ++i) #define rep2(i,m,n) for (int i = (m); i < (n); ++i) #define rep3(i,m,n,k) for (int i = (m); i < (n); i += (k)) #define rep(...) overload4(__VA_ARGS__, rep3, rep2, rep1)(__VA_ARGS__) #define inf 1000000000 using namespace std; #include #include #include #include #include #include #include #include #include #include #include using namespace std; // string はそのまま表示 ostream& operator<<(ostream& os, const string& s) { return os << '"' << s << '"'; } // pair template ostream& operator<<(ostream& os, const pair& p) { return os << "(" << p.first << ", " << p.second << ")"; } // tuple template struct TuplePrinter { static void print(ostream& os, const tuple& t) { TuplePrinter::print(os, t); os << ", " << get(t); } }; template struct TuplePrinter<1, Ts...> { static void print(ostream& os, const tuple& t) { os << get<0>(t); } }; template ostream& operator<<(ostream& os, const tuple& t) { os << "("; TuplePrinter::print(os, t); return os << ")"; } // iterable 判定 template class is_iterable { private: template static auto test(int) -> decltype( std::begin(declval()), std::end(declval()), true_type{} ); template static false_type test(...); public: static constexpr bool value = decltype(test(0))::value; }; template struct is_string : false_type {}; template<> struct is_string : true_type {}; // container 出力 template typename enable_if< is_iterable::value && !is_string::value, ostream& >::type operator<<(ostream& os, const T& v) { os << "{"; bool first = true; for (auto&& x : v) { if (!first) os << ", "; first = false; os << x; } return os << "}"; } // C配列出力(char配列は除外) template typename enable_if::type, char>::value, ostream&>::type operator<<(ostream& os, const T (&a)[N]) { os << "{"; for (size_t i = 0; i < N; i++) { if (i) os << ", "; os << a[i]; } return os << "}"; } #define debug(x) cerr << #x << " = " << (x) << endl vector> dij = {{0,1}, {1,0}, {0,-1}, {-1,0}}; //using mint = modint998244353; #include #include #include #include unsigned int bit_ceil(unsigned int n) { unsigned int x = 1; while (x < (unsigned int)(n)) x *= 2; return x; } int countr_zero(unsigned int n) { #ifdef _MSC_VER unsigned long index; _BitScanForward(&index, n); return index; #else return __builtin_ctz(n); #endif } 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())) { size = (int)bit_ceil((unsigned int)(_n)); log = countr_zero((unsigned int)size); 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; } 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]); } void push(int k) { all_apply(2 * k, lz[k]); all_apply(2 * k + 1, lz[k]); lz[k] = id(); } }; int isqrt(int n){ double x=sqrt(n); int ans=(int)x; while ((ans+1)*(ans+1)<=n){ ans++; } return ans; }; struct S{ long cnt_0; long cnt_1; array fi; }; S op(S x,S y){ array ans; rep (i,5){ ans[i]=x.fi[i]+y.fi[i]; } return S{x.cnt_0+y.cnt_0,x.cnt_1+y.cnt_1,ans}; }; S conv(long x){ if (x==0){ return S{1,0,{0,0,0,0,0}}; } else { array ans; ans[0]=x; rep(i,1,5){ ans[i]=isqrt(ans[i-1]); } return S{1,1,ans}; } }; S rot(S x){ array ans; rep(i,4){ ans[i]=x.fi[i+1]; } ans[4]=x.cnt_1; return S{x.cnt_0,x.cnt_1,ans}; }; S mapping(long f,S x){ if (f==-inf){ return x; } else if (f<0) { S now=x; rep (i,-f){ now=rot(now); } return now; } else { S ans=conv(f); array final; rep(i,5){ final[i]=ans.fi[i]*x.cnt_0; } return S{ans.cnt_0*x.cnt_0,ans.cnt_1*x.cnt_0,final}; } }; long composition(long f,long g){ if (f==-inf){ return g; } else if (g==-inf){ return f; } else if (f>=0){ return f; } else if (g>=0){ return mapping(f,conv(g)).fi[0]; } else { return f+g; } }; S e(){ return S{0,0,{0,0,0,0,0}}; } long id(){ return -inf; }; int main(){ long n,q; cin>>n>>q; vector a(n); rep(_,n){ long i; cin>>i; a[_]=conv(i); } lazy_segtree seg(a); rep(_,q){ long t,l,r; cin>>t>>l>>r; if (t==0){ cout<>x; seg.apply(l,r,x); } else { seg.apply(l,r,-1); } //rep(i,n){ // cout<