#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); } pair search(T v) { // Return the last position with query(i)> n >> q; vector a(n); int m = n; for(int i = 1; i < m; i <<= 1) if(m & i) m += i; SegmentTree f(m, 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; pair best = {std::numeric_limits::max(), -1}; const auto &p = f.search((sum + 1) / 2); const int &m = p.first; const T &v = p.second; if(m > 0) best = min(best, {abs(abs((v - a[m - 1]) - (sum - v))-a[m-1]%2), m - 1}); best = min(best, {abs(abs(v - (sum - v - a[m]))-a[m]%2), m}); if(m + 1 < n) best = min(best, {abs(abs((v + a[m]) - (sum - v - a[m] - a[m + 1]))-a[m+1]%2), m + 1}); cout << best.second << '\n'; } return 0; }