class RangeAddRangeMin: B = 512 # 一つのバケット幅 def __init__(self, a: list): n = len(a) bsize = (n + self.B - 1) // self.B self.buckets = [0] * bsize self.add_buckets = [0] * bsize # バケットへの加算 self.min_buckets = [0] * bsize # バケットの最小値 self.data = a.copy() for i in range(bsize): start = i * self.B stop = min(n, (i+1) * self.B) self.min_buckets[i] = min([a[i] for i in range(start, stop)]) def range_add(self, l: int, r: int, x: int): """[l, r) に x を加算""" assert 0 <= l < r <= len(self.data) for k in range(l // self.B, len(self.buckets)): nl = k * self.B nr = (k+1) * self.B if r <= nl: break if l <= nl and nr <= r: self.add_buckets[k] += x self.min_buckets[k] += x else: start = max(l, nl) stop = min(r, nr, len(self.data)) for i in range(start, stop): self.data[i] += x # バケットの最小値の更新 self.min_buckets[k] = INF for i in range(nl, min(nr, len(self.data))): s = self.add_buckets[k] + self.data[i] self.min_buckets[k] = min(self.min_buckets[k], s) def range_min(self, l: int, r: int) -> int: """[l, r) の最小値""" assert 0 <= l < r <= len(self.data) res = INF for k in range(l // self.B, len(self.buckets)): nl = k * self.B nr = (k+1) * self.B if r <= nl: break if l <= nl and nr <= r: res = min(res, self.min_buckets[k]) else: start = max(l, nl) stop = min(r, nr, len(self.data)) for i in range(start, stop): res = min(res, self.add_buckets[k] + self.data[i]) return res INF = 1 << 62 N = int(input()) A = list(map(int, input().split())) sd = RangeAddRangeMin(A) Q = int(input()) for _ in range(Q): qs = list(map(int, input().split())) match qs: case (1, L, R, C): L -= 1 R -= 1 sd.range_add(L, R+1, C) case (2, L, R, _): L -= 1 R -= 1 res = sd.range_min(L, R+1) print(res)