from atcoder.segtree import SegTree from atcoder.lazysegtree import LazySegTree def main(): n, q = list(map(int, input().split())) A = list(map(int, input().split())) D = set([1]) E = [] c = 1 while c <= 10**18: D.add(c) E.append(c-1) c *= 2 def op0(a, b): if a == -1: return b if b == -1: return a if min(a, b) == -2: return -2 if a != b: return -2 return a def op1(a, b): if a[0] == -1: return b if b[0] == -1: return a if a[2] != b[2] or min(a[2], b[2]) == -2: return (-2, -2, -2, -2) if a[1] <= b[1]: if a[0] == b[0] & (a[1]-1): return max(a[0], b[0]), max(a[1], b[1]), a[2], b[3] else: if b[0] == a[0] & (b[1]-1): return max(a[0], b[0]), max(a[1], b[1]), a[2], a[3] return (-2, -2, -2, -2) def mapp(a, b): if b[2] < 0: return b return (((b[3]+a)//b[2])%b[1], b[1], b[2], b[3]+a) def comp(a, b): return a+b def make(a): c = 1 while not a % 2: a //= 2 c *= 2 return a, c B = [0] X = [] for a in A: B.append(a+B[-1]) for i in range(n): a = A[i] b = B[i] a, c = make(a) X.append(((b//a)%c, c, a, b)) #st0 = SegTree(lambda a, b: op0, -1, [make(a)[0] for a in A]) st1 = LazySegTree(op1, (-1, -1, -1, -1), mapp, comp, 0, X) st2 = SegTree(lambda a, b: a+b, 0, A) idx = 0 for _ in range(q): Q = list(map(int, input().split())) if Q[0] == 1: k, x = Q[1:] k -= 1 d = x-A[k] A[k] = x st2.set(k, x) rep = st2.prod(0, k) a, c = make(x) st1.set(k, ((rep//a)%c, c, a, rep)) st1.apply(k+1, n, d) else: idx += 1 l, r = Q[1:] l -= 1 rep = st1.prod(l, r) #print([st1.get(i) for i in range(n)]) #print(A) #print(rep) #print(l, r) #print(st1.prod(0, 2)) #print(op1(st1.get(0), st1.get(1))) #print(st2.prod(0, l)) rep2 = st2.prod(l, r) if rep[2] == -2: an = "No" elif st2.prod(0, l) // rep[2] % rep[1] == rep[0] and rep2 // rep[2] in D: ans = "Yes" else: ans = "No" print(ans) #print("Yes" if rep[2] != -2 else "No") main()