using System; using static System.Console; using System.Linq; using System.Collections.Generic; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.Intrinsics.X86; using System.Runtime.Intrinsics.Arm; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray(); public static void Main() { Solve(); } static void Solve() { var c = NList; var (n, m) = (c[0], c[1]); var a = NList; var map = NArr(m); WriteLine(Bench(n, m, a, map)); } static long Bench(int n, int m, int[] a, int[][] map) { var w = new long[n]; foreach (var p in map) { w[p[0] - 1] += p[1]; } for (var i = 0; i < n; ++i) { if (a[i] <= w[i]) { return -1; } } var ok = w.Max(); if (a.Min() > w.Sum()) { return 0; } var ng = 0L; while (ok - ng > 1) { var mid = (ok + ng) / 2; var imos = new long[n]; var all = new long[n]; foreach (var p in map) { var x = p[0] - 1; var wi = p[1]; var pos = x - wi / mid; if (pos == x) { all[x] += wi; if (x + 1 < n) all[x + 1] -= wi; } else { if (x == 0) { imos[0] -= mid; all[0] += wi; } else if (pos <= 0) { imos[0] += mid; all[0] += wi - mid * x; } else { imos[pos] += mid; all[pos] += wi % mid; } if (x > 0) { imos[x] -= mid * 2; } if (wi % mid == 0) { pos = x + wi / mid; if (pos < n) imos[pos] += mid; } else { pos = x + 1 + wi / mid; if (pos < n) { imos[pos] += mid; all[pos] += (mid - wi % mid) % mid; } } } } var flg = true; for (var i = 0; i < n; ++i) { if (i > 0) { all[i] += all[i - 1] + imos[i - 1]; imos[i] += imos[i - 1]; } if (all[i] >= a[i]) flg = false; } if (flg) ok = mid; else ng = mid; } return ok; } }