Use this to learn the idea, then write your own version.
1using NodeType = array<array<int, 2>, 2>;2 3class SegmentTree {4 public:5 explicit SegmentTree(const vector<int>& nums) : n(nums.size()), tree(4 * n) {6 build(nums, 0, 0, n - 1);7 }8 9 10 void update(int i, int val) {11 update(0, 0, n - 1, i, val);12 }13 14 15 16 17 18 19 20 21 NodeType query(int i, int j) const {22 return query(0, 0, n - 1, i, j);23 }24 25 private:26 static constexpr int kInf = 1'000'000'000;27 static constexpr NodeType kDefaultNode = {{{-kInf, -kInf}, {-kInf, -kInf}}};28 const int n; 29 30 31 vector<NodeType> tree;32 33 void build(const vector<int>& nums, int treeIndex, int lo, int hi) {34 if (lo == hi) {35 tree[treeIndex] = {{{0, -kInf}, {-kInf, nums[lo]}}};36 return;37 }38 const int mid = (lo + hi) / 2;39 build(nums, 2 * treeIndex + 1, lo, mid);40 build(nums, 2 * treeIndex + 2, mid + 1, hi);41 tree[treeIndex] = merge(tree[2 * treeIndex + 1], tree[2 * treeIndex + 2]);42 }43 44 void update(int treeIndex, int lo, int hi, int i, int val) {45 if (lo == hi) {46 tree[treeIndex] = {{{0, -kInf}, {-kInf, val}}};47 return;48 }49 const int mid = (lo + hi) / 2;50 if (i <= mid)51 update(2 * treeIndex + 1, lo, mid, i, val);52 else53 update(2 * treeIndex + 2, mid + 1, hi, i, val);54 tree[treeIndex] = merge(tree[2 * treeIndex + 1], tree[2 * treeIndex + 2]);55 }56 57 NodeType query(int treeIndex, int lo, int hi, int i, int j) const {58 if (i <= lo && hi <= j) 59 return tree[treeIndex];60 if (j < lo || hi < i) 61 return kDefaultNode;62 const int mid = (lo + hi) / 2;63 return merge(query(2 * treeIndex + 1, lo, mid, i, j),64 query(2 * treeIndex + 2, mid + 1, hi, i, j));65 }66 67 68 NodeType merge(const NodeType& a, const NodeType& b) const {69 NodeType node = {{{0, 0}, {0, 0}}};70 for (int l = 0; l < 2; ++l)71 for (int r = 0; r < 2; ++r)72 node[l][r] =73 max({a[l][0] + b[0][r], a[l][0] + b[1][r], a[l][1] + b[0][r]});74 return node;75 }76};77 78class Solution {79 public:80 int maximumSumSubsequence(vector<int>& nums, vector<vector<int>>& queries) {81 constexpr int kMod = 1'000'000'007;82 const int n = nums.size();83 int ans = 0;84 SegmentTree tree(nums);85 86 for (const vector<int>& query : queries) {87 const int pos = query[0];88 const int x = query[1];89 tree.update(pos, x);90 NodeType res = tree.query(0, n - 1);91 ans = (ans + static_cast<long>(92 max({res[0][0], res[0][1], res[1][0], res[1][1]}))) %93 kMod;94 }95 96 return ans;97 }98};99