#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
const int N = 2e5 + 5;
struct Nod {
  i64 sum;
  int max_pos, max_pos2;
};
Nod pom[N * 4];
int v[N];
int n, q, update_pos, update_val, current_pos;
i64 query_sum, peak_sum;
static void pom_build(int nod, int l, int r) {
  if (l == r) {
    pom[nod] = {v[l], l, n + 1};
    return;
  }
  int med = (l + r) / 2;
  pom_build(2 * nod, l, med);
  pom_build(2 * nod + 1, med + 1, r);
  pom[nod].sum = pom[2 * nod].sum + pom[2 * nod + 1].sum;
  if (v[pom[2 * nod].max_pos] > v[pom[2 * nod + 1].max_pos]) {
    pom[nod].max_pos = pom[2 * nod].max_pos;
    pom[nod].max_pos2 = v[pom[2 * nod].max_pos2] > v[pom[2 * nod + 1].max_pos]
                            ? pom[2 * n].max_pos2
                            : pom[2 * nod + 1].max_pos;
  } else {
    pom[nod].max_pos = pom[2 * nod + 1].max_pos;
    pom[nod].max_pos2 = pom[2 * nod + 1].max_pos2;
  }
}
static void internal_update(int nod, int l, int r) {
  if (l == r) {
    pom[nod].sum = update_val;
    return;
  }
  int med = (l + r) / 2;
  if (update_pos <= med)
    internal_update(2 * nod, l, med);
  else
    internal_update(2 * nod + 1, med + 1, r);
  pom[nod].sum = pom[2 * nod].sum + pom[2 * nod + 1].sum;
  if (v[pom[2 * nod].max_pos] > v[pom[2 * nod + 1].max_pos]) {
    pom[nod].max_pos = pom[2 * nod].max_pos;
    pom[nod].max_pos2 = v[pom[2 * nod].max_pos2] > v[pom[2 * nod + 1].max_pos]
                            ? pom[2 * n].max_pos2
                            : pom[2 * nod + 1].max_pos;
  } else {
    pom[nod].max_pos = pom[2 * nod + 1].max_pos;
    pom[nod].max_pos2 = pom[2 * nod + 1].max_pos2;
  }
}
static int find_peak(int nod, int l, int r) {
  if (l == r) return l;
  if (v[pom[1].max_pos] == 0) return n >= 2 ? 2 : -1;
  int med = (l + r) / 2;
  if (current_pos < med && (pom[2 * nod].max_pos != current_pos
                                ? v[pom[2 * nod].max_pos]
                                : v[pom[2 * nod].max_pos2]) >= query_sum)
    return find_peak(2 * nod, l, med);
  else if (current_pos < r &&
           (pom[2 * nod + 1].max_pos != current_pos
                ? v[pom[2 * nod + 1].max_pos]
                : v[pom[2 * nod + 1].max_pos2]) >= query_sum) {
    peak_sum += pom[2 * nod].sum;
    return find_peak(2 * nod + 1, med + 1, r);
  } else
    return -1;
}
static void update(int pos, int val) {
  update_val = val;
  update_pos = pos;
  v[pos] = val;
  internal_update(1, 1, n);
}
static int query() {
  int pos = 0;
  peak_sum = 0;
  query_sum = 0;
  current_pos = 0;
  while ((pos = find_peak(1, 1, n)) != -1) {
    query_sum = peak_sum + v[pos];
    if (peak_sum == v[pos]) return pos;
    current_pos = pos;
    peak_sum = 0;
  }
  return -1;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  int pos, val;
  cin >> n >> q;
  for (int i = 1; i <= n; ++i) cin >> v[i];
  pom_build(1, 1, n);
  while (q--) {
    cin >> pos >> val;
    update(pos, val);
    cout << query() << '\n';
  }
  return 0;
}
