#include using namespace std; typedef long long ll; const int MAXN = 1 << 17; const ll NIL = -1; ll sm[2*MAXN], mn[2*MAXN], mx[2*MAXN], lz[2*MAXN]; int N; void apply(int v, int l, int r, ll val){ sm[v] = val*(r-l); mn[v] = mx[v] = val; lz[v] = val; } void push(int v, int l, int r){ if(lz[v] != NIL){ int m = (l+r)>>1; apply(2*v, l, m, lz[v]); apply(2*v+1, m, r, lz[v]); lz[v] = NIL; } } void pull(int v){ sm[v] = sm[2*v]+sm[2*v+1]; mn[v] = min(mn[2*v],mn[2*v+1]); mx[v] = max(mx[2*v],mx[2*v+1]); } void build(int v, int l, int r, vector& A){ lz[v] = NIL; if(l+1==r){ sm[v] = mn[v] = mx[v] = (l < (int)A.size() ? A[l] : 0); return; } int m = (l+r)>>1; build(2*v,l,m,A); build(2*v+1,m,r,A); pull(v); } ll qsum(int v, int l, int r, int ql, int qr){ if(ql<=l && r<=qr) return sm[v]; push(v,l,r); int m=(l+r)>>1; ll res=0; if(qlm) res+=qsum(2*v+1,m,r,ql,qr); return res; } void uassign(int v, int l, int r, int ql, int qr, ll val){ if(ql<=l && r<=qr){ apply(v,l,r,val); return; } push(v,l,r); int m=(l+r)>>1; if(qlm) uassign(2*v+1,m,r,ql,qr,val); pull(v); } inline ll isq(ll x){ ll s = sqrtl(x); while(s*s > x) s--; while((s+1)*(s+1) <= x) s++; return s; } void uisqrt(int v, int l, int r, int ql, int qr){ if(ql>=r || l>=qr) return; ll a = isq(mn[v]), b = isq(mx[v]); if(ql<=l && r<=qr && a==b){ apply(v,l,r,a); return; } if(l+1==r){ sm[v]=mn[v]=mx[v]=a; lz[v]=NIL; return; } push(v,l,r); int m=(l+r)>>1; uisqrt(2*v,l,m,ql,qr); uisqrt(2*v+1,m,r,ql,qr); pull(v); } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n, q; cin >> n >> q; vector A(n); for(auto& a : A) cin >> a; N = MAXN; build(1, 0, N, A); while(q--){ int t; cin >> t; if(t==0){ int l,r; cin>>l>>r; cout << qsum(1,0,N,l,r) << '\n'; } else if(t==1){ int l,r; ll x; cin>>l>>r>>x; uassign(1,0,N,l,r,x); } else { int l,r; cin>>l>>r; uisqrt(1,0,N,l,r); } } }