Advertisement
he_obviously

Untitled

Apr 27th, 2020
449
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 KB | None | 0 0
  1. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
  2. //#pragma GCC optimize("unroll-loops")
  3. //#pragma GCC optimize("Ofast")
  4.  
  5. #include <bits/stdc++.h>
  6.  
  7. using namespace std;
  8.  
  9. typedef long long ll;
  10.  
  11. #define pb push_back
  12. #define pii pair<int, int>
  13. #define mp make_pair
  14. #define loop(i, n) for(int i = 0; i < (int)n; ++i)
  15. #define loop1(i, n) for(int i = 1; i <= (int)n; ++i)
  16. #define F first
  17. #define S second
  18. #define sorted(a) sort(a.begin(), a.end())
  19.  
  20. vector <ll> a;
  21. vector <ll> tree;
  22.  
  23. void build(int v, int l, int r) {
  24.     if (l == r) {
  25.         tree[v] = a[l];
  26.     }
  27.     else {
  28.         int mid = (l + r) / 2;
  29.         build(2 * v, l, mid);
  30.         build(2 * v + 1, mid + 1, r);
  31.         tree[v] = tree[2 * v] + tree[2 * v + 1];
  32.     }
  33. }
  34.  
  35. ll sum(int v, int l, int r, int tl, int tr) {
  36.     if (l == tl && r == tr) {
  37.         return tree[v];
  38.     }
  39.     else if (l > r) {
  40.         return 0;
  41.     }
  42.     else {
  43.         int mid = (tl + tr) / 2;
  44.         return sum(2 * v, l, min(r, mid), tl, mid) + sum(2 * v + 1, max(mid + 1, l), r, mid + 1, tr);
  45.     }
  46. }
  47.  
  48. ll suf(int v, int tl, int tr) {
  49.     if (tl == tr) {
  50.         return a[tl];
  51.     }
  52.     else {
  53.         int mid = (tl + tr) / 2;
  54.         return max(tree[2 * v + 1] + suf(2 * v, tl, mid), suf(2 * v + 1, mid + 1, tr));
  55.     }
  56. }
  57.  
  58. ll pref(int v, int tl, int tr) {
  59.     if (tl == tr) {
  60.         return a[tl];
  61.     }
  62.     else {
  63.         int mid = (tl + tr) / 2;
  64.         return max(tree[2 * v] + pref(2 * v + 1, mid + 1, tr), pref(2 * v, tl, mid));
  65.     }
  66. }
  67.  
  68. ll get_ans(int v, int tl, int tr) {
  69.     int mid = (tl + tr) / 2;
  70.     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)));
  71. }
  72.  
  73. void update(int v, int i, ll x, int tl, int tr) {
  74.     if (tl == tr) {
  75.         tree[v] = x;
  76.     }
  77.     else {
  78.         int mid = (tl + tr) / 2;
  79.         if (i <= mid) {
  80.             update(2 * v, i, x, tl, mid);
  81.         }
  82.         else {
  83.             update(2 * v, i, x, mid + 1, tr);
  84.         }
  85.         tree[v] = tree[2 * v] + tree[2 * v + 1];
  86.     }
  87. }
  88.  
  89. int main() {
  90.     ios::sync_with_stdio(0);
  91.     cin.tie(0); cout.tie(0);
  92.     int n, m;
  93.     cin >> n >> m;
  94.     a.resize(n); tree.resize(4 * n);
  95.     for (int i = 0; i < n; ++i) {
  96.         cin >> a[i];
  97.     }
  98.     for (int i = 0; i < m; ++i) {
  99.         int j; ll x;
  100.         cin >> j >> x;
  101.         update(1, j, x, 0, n - 1);
  102.         cout << get_ans(1, 0, n - 1) << "\n";
  103.     }
  104.     return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement