Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
- //#pragma GCC optimize("unroll-loops")
- //#pragma GCC optimize("Ofast")
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- #define pb push_back
- #define pii pair<int, int>
- #define mp make_pair
- #define loop(i, n) for(int i = 0; i < (int)n; ++i)
- #define loop1(i, n) for(int i = 1; i <= (int)n; ++i)
- #define F first
- #define S second
- #define sorted(a) sort(a.begin(), a.end())
- vector <ll> a;
- vector <ll> tree;
- void build(int v, int l, int r) {
- if (l == r) {
- tree[v] = a[l];
- }
- else {
- int mid = (l + r) / 2;
- build(2 * v, l, mid);
- build(2 * v + 1, mid + 1, r);
- tree[v] = tree[2 * v] + tree[2 * v + 1];
- }
- }
- ll sum(int v, int l, int r, int tl, int tr) {
- if (l == tl && r == tr) {
- return tree[v];
- }
- else if (l > r) {
- return 0;
- }
- else {
- int mid = (tl + tr) / 2;
- return sum(2 * v, l, min(r, mid), tl, mid) + sum(2 * v + 1, max(mid + 1, l), r, mid + 1, tr);
- }
- }
- ll suf(int v, int tl, int tr) {
- if (tl == tr) {
- return a[tl];
- }
- else {
- int mid = (tl + tr) / 2;
- return max(tree[2 * v + 1] + suf(2 * v, tl, mid), suf(2 * v + 1, mid + 1, tr));
- }
- }
- ll pref(int v, int tl, int tr) {
- if (tl == tr) {
- return a[tl];
- }
- else {
- int mid = (tl + tr) / 2;
- return max(tree[2 * v] + pref(2 * v + 1, mid + 1, tr), pref(2 * v, tl, mid));
- }
- }
- ll get_ans(int v, int tl, int tr) {
- int mid = (tl + tr) / 2;
- return max(suf(2 * v, tl, mid) + pref(2 * v + 1, mid + 1, tr), max(get_ans(2 * v, tl, mid), get_ans(2 * v + 1, mid + 1, tr)));
- }
- void update(int v, int i, ll x, int tl, int tr) {
- if (tl == tr) {
- tree[v] = x;
- }
- else {
- int mid = (tl + tr) / 2;
- if (i <= mid) {
- update(2 * v, i, x, tl, mid);
- }
- else {
- update(2 * v, i, x, mid + 1, tr);
- }
- tree[v] = tree[2 * v] + tree[2 * v + 1];
- }
- }
- int main() {
- ios::sync_with_stdio(0);
- cin.tie(0); cout.tie(0);
- int n, m;
- cin >> n >> m;
- a.resize(n); tree.resize(4 * n);
- for (int i = 0; i < n; ++i) {
- cin >> a[i];
- }
- for (int i = 0; i < m; ++i) {
- int j; ll x;
- cin >> j >> x;
- update(1, j, x, 0, n - 1);
- cout << get_ans(1, 0, n - 1) << "\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement