#include using namespace std; using T = long long; T op(T a, T b) { return a + b; } struct SegmentTree { int n; vector tree; T id; SegmentTree(int _n, T _id) : n(_n), tree(2 * n, _id), id(_id) {} void set(int i, T val) { for(tree[i + n] = val, i = (i + n) / 2; i > 0; i /= 2) tree[i] = op(tree[2 * i], tree[2 * i + 1]); } T query(int l, int r) { T lhs = T(id), rhs = T(id); for(l += n, r += n; l < r; l >>= 1, r >>= 1) { if(l & 1) lhs = op(lhs, tree[l++]); if(!(r & 1)) rhs = op(tree[r--], rhs); } return op(l == r ? op(lhs, tree[l]) : lhs, rhs); } }; int main() { int n, q; cin >> n >> q; vector a(n); SegmentTree f(n, 0); T sum = 0; for(int i = 0; i < n; ++i) { cin >> a[i]; sum += a[i]; f.set(i, a[i]); } while(q--) { int i; T x; cin >> i >> x; f.set(i, x); sum += x - a[i]; a[i] = x; int l = 0, h = n - 1; // m in [l,h] pair best = {std::numeric_limits::max(), -1}; while(l <= h) { int m = (l + h + 1) / 2; T ls = f.query(0, m - 1); // [0,m) T rs = sum - ls - a[m]; pair p{abs(abs(ls - rs)-a[m]%2), m}; best = min(best, p); if(l == h) break; if(ls < rs) l = m + 1; if(ls >= rs) h = m - 1; } cout << best.second << '\n'; } return 0; }