## https://yukicoder.me/problems/no/1008 def solve(N, M, A, xw, c): array = [0] * (N + 2) for x, w in xw: d = w // c l = max(0, x - d) r = min(N - 1, x + d) array[l + 1] += c array[x + 1] -= c array[x + 1] -= c array[r] += c cum_x = 0 for i in range(N + 2): cum_x += array[i] array[i] = cum_x cum_x = 0 for i in range(N + 2): cum_x += array[i] array[i] = cum_x for i in range(N): if array[i] >= A[i]: return False return True def main(): N, M = map(int, input().split()) A = list(map(int, input().split())) xw = [] sum_w = 0 for _ in range(M): x, w = map(int, input().split()) xw.append((x - 1, w)) sum_w += 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 = sum_w 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()