/* Problem URL: https://cses.fi/problemset/task/1190 */ #include using namespace std; #define V vector #define rmin(a, b) a = min(a, b) #define rmax(a, b) a = max(a, b) #define rep(i, lim) for (size_t i = 0; i < (lim); i++) #define nrep(i, s, lim) for (size_t i = s; i < (lim); i++) #define repv(i, v) for (auto &i : (v)) #define fillv(v) for (auto &itr_ : (v)) { cin >> itr_; } #define sortv(v) sort(v.begin(), v.end()) #define all(v) (v).begin(), (v).end() using vi = vector; using vvi = vector; using vvvi = vector; using vvvvi = vector; using ll = long long; using vl = vector; using vvl = vector; using vvvl = vector; using vvvvl = vector; template auto operator<<(ostream &os, const vector &vec)->ostream& { os << vec[0]; for (size_t i = 1; i < vec.size(); i++) { os << ' ' << vec[i]; } os << '\n'; return os; } template auto operator>>(istream &is, vector &vec)->istream& { for (auto &i : vec) { is >> i; } return is; } template auto operator<<(ostream &os, const vector> &vec)->ostream& { for (auto &i : vec) { os << i[0]; for (size_t j = 1; j < i.size(); j++) { os << ' ' << i[j]; } os << '\n'; } return os; } template auto operator>>(istream &is, vector> &vec)->istream& { for (auto &i : vec) { for (auto &j : i) { is >> j; } } return is; } struct node { ll ans; ll sum; ll pref; ll suf; node(ll ans, ll sum, ll pref, ll suf): ans(ans), sum(sum), pref(pref), suf(suf) {} node() = default; }; V segtree; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; vl ar(n); cin >> ar; while (__builtin_popcount(n) != 1) { ar.push_back(-1); n++; } segtree.resize(n * 2); for (size_t i = n; i < n * 2; i++) { segtree[i] = node(max(ar[i - n], 0LL), ar[i - n], max(ar[i - n], 0LL), max(ar[i - n], 0LL)); } for (size_t i = n - 1; i > 0; i--) { segtree[i].ans = max(segtree[i * 2].suf + segtree[i * 2 + 1].pref, max(segtree[i * 2].ans, segtree[i * 2 + 1].ans)); segtree[i].sum = segtree[i * 2].sum + segtree[i * 2 + 1].sum; segtree[i].pref = max(segtree[i * 2].pref, segtree[i * 2].sum + segtree[i * 2 + 1].pref); segtree[i].suf = max(segtree[i * 2 + 1].suf, segtree[i * 2 + 1].sum + segtree[i * 2].suf); } while (m--) { ll i, v; cin >> i >> v; segtree[n + i - 1] = node(max(v, 0LL), v, max(v, 0LL), max(v, 0LL)); for (size_t j = (n + i - 1) / 2; j > 0; j /= 2) { segtree[j].ans = max(segtree[j * 2].suf + segtree[j * 2 + 1].pref, max(segtree[j * 2].ans, segtree[j * 2 + 1].ans)); segtree[j].sum = segtree[j * 2].sum + segtree[j * 2 + 1].sum; segtree[j].pref = max(segtree[j * 2].pref, segtree[j * 2].sum + segtree[j * 2 + 1].pref); segtree[j].suf = max(segtree[j * 2 + 1].suf, segtree[j * 2 + 1].sum + segtree[j * 2].suf); } cout << segtree[1].ans << '\n'; } }