#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 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{ int cnt_0; int 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(int 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(int 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}; } }; int composition(int f,int 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}}; } int id(){ return -inf; }; int main(){ int n,q; cin>>n>>q; vector a(n); rep(_,n){ int i; cin>>i; a[_]=conv(i); } lazy_segtree seg(a); rep(_,q){ int t,l,r; cin>>t>>l>>r; if (t==0){ cout<>x; seg.apply(l,r,x); } else { seg.apply(l,r,-1); } } }