#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 7;
int n, q;
long long a[maxn], s[maxn], sum;
long long max(long long a, long long b) { return a > b ? a : b; }
struct SegmentTree {
  int l, r;
  long long mx, add;
} tree[maxn << 2];
void build(int p, int l, int r) {
  tree[p].l = l;
  tree[p].r = r;
  tree[p].add = 0;
  tree[p].mx = s[r];
  if (l == r) return;
  int mid = (l + r) >> 1;
  build(p << 1, l, mid);
  build(p << 1 | 1, mid + 1, r);
}
void spread(int p) {
  if (tree[p].add) {
    tree[p << 1].mx += tree[p].add;
    tree[p << 1 | 1].mx += tree[p].add;
    tree[p << 1].add += tree[p].add;
    tree[p << 1 | 1].add += tree[p].add;
    tree[p].add = 0;
  }
  tree[p].mx = max(tree[p << 1].mx, tree[p << 1 | 1].mx);
}
void change(int p, int l, int r, long long x) {
  if (l <= tree[p].l && tree[p].r <= r) {
    tree[p].add += x;
    tree[p].mx += x;
    return;
  }
  spread(p);
  int mid = (tree[p].l + tree[p].r) >> 1;
  if (l <= mid) change(p << 1, l, r, x);
  if (r > mid) change(p << 1 | 1, l, r, x);
  tree[p].mx = max(tree[p << 1].mx, tree[p << 1 | 1].mx);
}
int query(int p, long long x) {
  if (tree[p].mx < 2ll * x) {
    return 0;
  }
  if (tree[p].l == tree[p].r) {
    sum = tree[p].mx;
    return tree[p].l;
  }
  spread(p);
  if (tree[p << 1].mx >= 2ll * x) {
    return query(p << 1, x);
  } else {
    return query(p << 1 | 1, x);
  }
  tree[p].mx = max(tree[p << 1].mx, tree[p << 1 | 1].mx);
}
int main() {
  scanf("%d%d", &n, &q);
  for (int i = 1; i <= n; i++) {
    scanf("%d", a + i);
    s[i] = s[i - 1] + a[i];
  }
  build(1, 1, n);
  while (q--) {
    int p;
    long long x;
    scanf("%d%lld", &p, &x);
    change(1, p, n, x - a[p]);
    a[p] = x;
    if (a[1] == 0) {
      puts("1");
      continue;
    }
    sum = a[1];
    while (1) {
      int x = query(1, sum);
      if (!x) {
        puts("-1");
        break;
      } else {
        if (sum == 2ll * a[x]) {
          printf("%d\n", x);
          break;
        }
      }
    }
  }
  return 0;
}
