Times Limited Exceeded on test 16
实测吸氧无效
// Per aspera ad astra.
// 1004535809
#include <cctype>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define re register
#define br break
#define co continue
#define ll long long
#define DEBUG if (dbg)
#ifndef ABC
#define getchar() (_S == _T && (_T = (_S = _B) + fread(_B, 1, 1 << 15, stdin), _S == _T) ? EOF : *_S++)
#endif
char _B[1 << 15], *_S = _B, *_T = _B;
ll fr() {
re ll s = 0, f = 1;
re char ch;
for (; (ch = getchar()) < '0' || ch > '9'; ch == '-' ? f = -f : 0);
for (; ch >= '0' && ch <= '9'; s = s * 10 + ch - '0', ch = getchar());
return s * f;
}
int dbg = 0;
#include <set>
#include <queue>
using namespace std;
const int N = 2e5, P = 1e9 + 7;
template <class T> T cmin(re T a, re T b) {return a < b ? a : b;}
template <class T> T cmax(re T a, re T b) {return a > b ? a : b;}
template <class T> void cswp(re T &a, re T &b) {T t = a;a = b, b = t;}
inline int Add(re int x, re int y) {return x + y < P ? x + y : x + y - P;}
inline int Sub(re int x, re int y) {return x - y < 0 ? x - y + P : x - y;}
inline int Mul(re int x, re int y) {re ll z = 1ll * x * y; return z < P ? z : z % P;}
int Ans, A[N + 5], S[N + 5], Tag[N + 5 << 2], Wgt[N + 5 << 2];
inline void Psdown(re int o, re int l, re int r) {
if (Tag[o]) {
re int m = l + r >> 1;
Tag[o << 1] += Tag[o], Tag[o << 1 | 1] += Tag[o];
Wgt[o << 1] += Tag[o], Wgt[o << 1 | 1] += Tag[o];
Tag[o] = 0;
}
}
inline void Build(re int o, re int l, re int r) {
if (l == r) {Wgt[o] = A[l] - S[l - 1]; return;}
re int m = l + r >> 1;
Build(o << 1, l, m); Build(o << 1 | 1, m + 1, r);
Wgt[o] = max(Wgt[o << 1], Wgt[o << 1 | 1]);
}
inline void Modify(re int o, re int ql, re int qr, re int l, re int r, re int v) {
if (ql <= l && r <= qr) {
Tag[o] += v; Wgt[o] += v; return;
}
re int m = l + r >> 1;
Psdown(o, l, r);
if (ql <= m) Modify(o << 1, ql, qr, l, m, v);
if (qr > m) Modify(o << 1 | 1, ql, qr, m + 1, r, v);
Wgt[o] = max(Wgt[o << 1], Wgt[o << 1 | 1]);
}
inline void Query(re int o, re int l, re int r) {
if (~Ans) return;
if (l == r) {
if (!Wgt[o]) Ans = l; return;
}
re int m = l + r >> 1;
Psdown(o, l, r);
if (Wgt[o << 1] >= 0) Query(o << 1, l, m);
if (Wgt[o << 1 | 1] >= 0) Query(o << 1 | 1, m + 1, r);
}
signed main() {
#ifndef ONLINE_JUDGE
dbg = 1;
#endif
re int n = fr(), _ = fr();
for (re int i = 1; i <= n; ++i) {
A[i] = fr(); S[i] = S[i - 1] + A[i];
}
Build(1, 1, n);
while (_--) {
re int p = fr(), v = fr(), tmp = v - A[p]; A[p] = v;
Modify(1, p, p, 1, n, tmp);
if (p < n) Modify(1, p + 1, n, 1, n, -tmp);
Ans = -1; Query(1, 1, n);
printf("%d\n", Ans);
}
return 392699 ^ 392699;
}