#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
pair<int, int> max(pair<int, int> a, pair<int, int> b) {
  if (a.first > b.first)
    return a;
  else if (b.first > a.first)
    return b;
  else if (a.second < b.second)
    return a;
  return b;
}
struct tree {
  long long int sum = 0;
  pair<int, int> max_l = make_pair(0, inf);
  pair<int, int> max_r = make_pair(0, inf);
  pair<int, int> my_max = make_pair(0, inf);
};
void init(int b, int e, tree Tree[]) {
  if (e - b > 1) {
    init(b, (b + e) / 2, Tree);
    init((b + e) / 2, e, Tree);
    Tree[b + e].sum = Tree[b + (b + e) / 2].sum + Tree[e + (b + e) / 2].sum;
    Tree[b + e].my_max =
        max(Tree[b + (b + e) / 2].my_max, Tree[e + (b + e) / 2].my_max);
    Tree[b + e].max_l = Tree[b + (b + e) / 2].my_max;
    Tree[b + e].max_r = Tree[e + (b + e) / 2].my_max;
  }
}
void update(int l, int r, int b, int e, int val, tree Tree[]) {
  if (e <= l || r <= b) return;
  if (l <= b && r >= e) {
    Tree[b + e].sum += val;
    Tree[b + e].my_max.first = Tree[b + e].max_l.first =
        Tree[b + e].max_r.first = Tree[b + e].my_max.first + val;
  } else {
    update(l, r, b, (b + e) / 2, val, Tree);
    update(l, r, (b + e) / 2, e, val, Tree);
    Tree[b + e].sum = Tree[b + (b + e) / 2].sum + Tree[e + (b + e) / 2].sum;
    Tree[b + e].my_max =
        max(Tree[b + (b + e) / 2].my_max, Tree[e + (b + e) / 2].my_max);
    Tree[b + e].max_l = Tree[b + (b + e) / 2].my_max;
    Tree[b + e].max_r = Tree[e + (b + e) / 2].my_max;
  }
}
long long int query_sum(int l, int r, int b, int e, tree Tree[]) {
  if (e <= l || r <= b) return 0;
  if (l <= b && r >= e) {
    return Tree[b + e].sum;
  }
  return query_sum(l, r, (b + e) / 2, e, Tree) +
         query_sum(l, r, b, (b + e) / 2, Tree);
}
int query_min(int l, int r, int b, int e, long long int val, tree Tree[]) {
  if (e <= l || r <= b) return inf;
  if (l <= b && r >= e) {
    auto &t = Tree[b + e];
    if (e - b == 1) {
      if (t.my_max.first >= val) return t.my_max.second;
      return inf;
    }
    if (t.max_l.first >= val) return query_min(l, r, b, (b + e) / 2, val, Tree);
    return query_min(l, r, (b + e) / 2, e, val, Tree);
  }
  return min(query_min(l, r, b, (b + e) / 2, val, Tree),
             query_min(l, r, (b + e) / 2, e, val, Tree));
}
const int MAXN = 2e5;
int tab[MAXN + 1];
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n, q;
  cin >> n >> q;
  int s = 1;
  while (s <= 2 * n) {
    s *= 2;
  }
  tree Tree[s];
  for (int i = 0; i < n; ++i) {
    cin >> tab[i];
    Tree[i * 2 + 1].my_max = Tree[i * 2 + 1].max_l = Tree[i * 2 + 1].max_r =
        make_pair(tab[i], i);
    Tree[i * 2 + 1].sum = tab[i];
  }
  init(0, s / 2, Tree);
  for (int i = 0; i < q; ++i) {
    int p, x;
    cin >> p >> x;
    p--;
    update(p, p + 1, 0, s / 2, x - tab[p], Tree);
    int in = 0;
    long long int temp_sum = 0;
    tab[p] = x;
    while (in != inf && tab[in] != query_sum(0, in, 0, s / 2, Tree)) {
      temp_sum = query_sum(0, in + 1, 0, s / 2, Tree);
      in = query_min(in + 1, s / 2, 0, s / 2, temp_sum, Tree);
    }
    if (in == inf) {
      cout << -1 << "\n";
    } else {
      cout << in + 1 << "\n";
    }
  }
  return 0;
}
