import sys from math import isqrt def main(): sys.setrecursionlimit(300000) d = sys.stdin.buffer.read().split(); i = 0 N, Q = int(d[0]), int(d[1]); i = 2 A = list(map(int, d[i:i+N])); i += N M = 1 while M < N: M <<= 1 S = [0]*(2*M); X = [0]*(2*M); T = [-1]*(2*M) for k in range(N): S[M+k] = X[M+k] = T[M+k] = A[k] for k in range(M+N, 2*M): T[k] = 0 for v in range(M-1, 0, -1): S[v] = S[2*v]+S[2*v+1] X[v] = max(X[2*v], X[2*v+1]) T[v] = T[2*v] if T[2*v] != -1 and T[2*v] == T[2*v+1] else -1 def put(v, n, x): S[v], X[v], T[v] = x*n, x, x def push(v, a, b): if T[v] != -1: put(2*v, a, T[v]); put(2*v+1, b, T[v]); T[v] = -1 def pull(v): S[v] = S[2*v]+S[2*v+1]; X[v] = max(X[2*v], X[2*v+1]) T[v] = T[2*v] if T[2*v] != -1 and T[2*v] == T[2*v+1] else -1 def asn(v,l,r,ql,qr,x): if qr<=l or r<=ql: return if ql<=l and r<=qr: put(v,r-l,x); return m=(l+r)>>1; push(v,m-l,r-m) asn(2*v,l,m,ql,qr,x); asn(2*v+1,m,r,ql,qr,x); pull(v) def sqr(v,l,r,ql,qr): if qr<=l or r<=ql or X[v]<=1: return if ql<=l and r<=qr and T[v]!=-1: put(v,r-l,isqrt(T[v])); return m=(l+r)>>1; push(v,m-l,r-m) sqr(2*v,l,m,ql,qr); sqr(2*v+1,m,r,ql,qr); pull(v) def qs(v,l,r,ql,qr): if qr<=l or r<=ql: return 0 if ql<=l and r<=qr: return S[v] m=(l+r)>>1; push(v,m-l,r-m) return qs(2*v,l,m,ql,qr)+qs(2*v+1,m,r,ql,qr) out = [] for _ in range(Q): t = d[i]; i += 1 if t == b'0': l,r = int(d[i]),int(d[i+1]); i+=2; out.append(str(qs(1,0,M,l,r))) elif t == b'1': l,r,x = int(d[i]),int(d[i+1]),int(d[i+2]); i+=3; asn(1,0,M,l,r,x) else: l,r = int(d[i]),int(d[i+1]); i+=2; sqr(1,0,M,l,r) sys.stdout.write('\n'.join(out)) main()