## https://yukicoder.me/problems/no/1008 def solve2(N, M, xw, c): array = [0] * (N + 1) for x, w in xw: d = w // c if d > 0: from_i = x + 1 to_i = x + d if from_i < N: array[from_i] += -c if to_i < N: array[to_i + 1] -= -c a = 0 for i in range(N + 1): a += array[i] array[i] = a for x, w in xw: array[x] += w e = w % c d = w // c end_index = x + d if end_index < N: array[end_index + 1] -= e a = 0 for i in range(N + 1): a += array[i] array[i] = a return array[:N] def solve(N, M, A, xw, c): if c > 0: array_right = solve2(N, M, xw, c) xw_ = [] for x, w in xw: xw_.append((N - 1 - x, w)) array_left = solve2(N, M, xw_, c) array_left.reverse() array = [0] * N for i in range(N): array[i] = array_left[i] + array_right[i] for x, w in xw: array[x] -= w for i in range(N): if array[i] >= A[i]: return False return True else: sum_w = 0 for _, w in xw: sum_w += w for i in range(N): if sum_w >= A[i]: return False return True def main(): N, M = map(int, input().split()) A = list(map(int, input().split())) xw = [] for _ in range(M): x, w = map(int, input().split()) xw.append((x - 1, w)) # そもそもcが=sum_wでも壊れることはない? cost = [0] * N for x, w in xw: cost[x] += w for i in range(N): if cost[i] >= A[i]: print(-1) return # cの壊れる最小値を2部探索で計算 low = 0 high = max(cost) while high - low > 1: mid = (high + low) // 2 if solve(N, M, A, xw, mid): high = mid else: low = mid if solve(N, M, A, xw, low): print(low) else: print(high) if __name__ == "__main__": main()