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); 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]) { WriteLine(-1); return; } } var ok = w.Max(); if (a.Min() >= w.Sum()) { WriteLine(0); return; } var ng = 0L; while (ok - ng > 1) { var mid = (ok + ng) / 2; var imos = new long[n]; var all = new long[n]; for (var i = 0; i < n; ++i) if (w[i] > 0) { var pos = i - w[i] / mid; if (i == 0) { all[0] += w[i] - mid; imos[0] += mid; } else if (pos <= 0) { all[0] += w[i] - mid * (i + 1); imos[0] += mid; } else { all[pos] += w[i] % mid; imos[pos + 1] += mid; } pos = i + 1; if (pos < n) imos[pos] -= mid * 2; pos += w[i] / mid; if (pos < n) { all[pos] += (mid - w[i] % mid) % mid; } ++pos; if (pos < n) imos[pos] += mid; } var flg = true; for (var i = 0; i < n; ++i) { if (i > 0) { imos[i] += imos[i - 1]; all[i] += all[i - 1]; } all[i] += imos[i]; if (all[i] > a[i]) flg = false; } if (flg) ok = mid; else ng = mid; } WriteLine(ok); } }