#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
void makedata() {
  freopen("input.txt", "w", stdout);
  fclose(stdout);
}
long long a[250000];
int n, q;
template <typename T>
class SegmentTree {
 private:
  T *data, *lazy;
  int type;
  void pushup(int rt) {
    if (type == 0)
      data[rt] = data[rt << 1] + data[rt << 1 | 1];
    else if (type == 1)
      data[rt] = max(data[rt << 1], data[rt << 1 | 1]);
  }
  void pushdown(int rt, T m) {
    if (lazy[rt] == 0) return;
    lazy[rt << 1] += lazy[rt];
    lazy[rt << 1 | 1] += lazy[rt];
    if (type == 0) {
      data[rt << 1] += (m - (m >> 1)) * lazy[rt];
      data[rt << 1 | 1] += (m >> 1) * lazy[rt];
    } else if (type == 1) {
      data[rt << 1] += lazy[rt];
      data[rt << 1 | 1] += lazy[rt];
    }
    lazy[rt] = 0;
  }

 public:
  SegmentTree(int n, int t)
      : data((T *)malloc((n << 3) * sizeof(T))),
        lazy((T *)malloc((n << 3) * sizeof(T))),
        type(t) {}
  void Build(T *base, int l, int r, int rt) {
    lazy[rt] = 0;
    if (l == r)
      data[rt] = base[l];
    else {
      int mid = (l + r) >> 1;
      Build(base, l, mid, rt << 1);
      Build(base, mid + 1, r, rt << 1 | 1);
      pushup(rt);
    }
  }
  void Modify(int l, int r, int rt, int L, int R, T v) {
    if (L <= l && R >= r) {
      lazy[rt] += v;
      if (type == 0)
        data[rt] += v * (r - l + 1);
      else if (type == 1)
        data[rt] += v;
      return;
    }
    pushdown(rt, r - l + 1);
    int mid = (l + r) >> 1;
    if (L <= mid) Modify(l, mid, rt << 1, L, R, v);
    if (R > mid) Modify(mid + 1, r, rt << 1 | 1, L, R, v);
    pushup(rt);
  }
  T QueryPoint(int l, int r, int rt, int val) {
    if (l == r) return data[rt];
    pushdown(rt, r - l + 1);
    int mid = (l + r) >> 1;
    T ret = 0;
    if (val <= mid)
      ret = QueryPoint(l, mid, rt << 1, val);
    else
      ret = QueryPoint(mid + 1, r, rt << 1 | 1, val);
    pushup(rt);
    return ret;
  }
  T QuerySegment(int l, int r, int rt, int L, int R) {
    pushdown(rt, r - l + 1);
    if (L == l && R == r) return data[rt];
    int mid = (l + r) >> 1;
    if (R <= mid) return QuerySegment(l, mid, rt << 1, L, R);
    if (mid < L) return QuerySegment(mid + 1, r, rt << 1 | 1, L, R);
    if (type == 0)
      return QuerySegment(l, mid, rt << 1, L, mid) +
             QuerySegment(mid + 1, r, rt << 1 | 1, mid + 1, R);
    else if (type == 1)
      return max(QuerySegment(l, mid, rt << 1, L, mid),
                 QuerySegment(mid + 1, r, rt << 1 | 1, mid + 1, R));
  }
  int find(int l, int r, int rt, int p, T x) {
    if (r <= p) return -1;
    if (data[rt] < x) return -1;
    if (l == r) return l;
    int mid = (l + r) >> 1;
    if (l > p) {
      if (data[rt << 1] >= x)
        return find(l, mid, rt << 1, p, x);
      else
        return find(mid + 1, r, rt << 1 | 1, p, x);
    }
    int rtn = find(l, mid, rt << 1, p, x);
    if (rtn != -1) return rtn;
    return find(mid + 1, r, rt << 1 | 1, p, x);
  }
};
SegmentTree<long long> Tsum(250000, 0), Tmax(250000, 1);
int main() {
  std::ios::sync_with_stdio(0), cin.tie(0);
  cin >> n >> q;
  for (int i = 1; i <= n; i++) cin >> a[i];
  Tsum.Build(a, 1, n, 1);
  Tmax.Build(a, 1, n, 1);
  while (q--) {
    int p;
    long long x;
    cin >> p >> x;
    Tsum.Modify(1, n, 1, p, p, x - a[p]);
    Tmax.Modify(1, n, 1, p, p, x - a[p]);
    a[p] = x;
    if (a[1] == 0) {
      cout << 1 << endl;
      continue;
    }
    int m = 1;
    while (1) {
      long long sum = Tsum.QuerySegment(1, n, 1, 1, m);
      int nex = Tmax.find(1, n, 1, m, sum);
      if (nex == -1) {
        cout << -1 << endl;
        break;
      }
      if (a[nex] == Tsum.QuerySegment(1, n, 1, 1, nex - 1)) {
        cout << nex << endl;
        break;
      }
      m = nex;
    }
  }
  return 0;
}
