1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
const int MOD = 1e9+7;
struct Node {
long long dp0, dp1;
};
class SegmentTree {
vector<Node> tree;
int n;
public:
SegmentTree(const vector<int>& nums) {
n = nums.size();
tree.resize(4*n);
build(nums, 0, n-1, 1);
}
void build(const vector<int>& nums, int l, int r, int node) {
if (l == r) {
tree[node] = {0, nums[l]};
return;
}
int m = (l + r) / 2;
build(nums, l, m, 2*node);
build(nums, m+1, r, 2*node+1);
merge(node);
}
void update(int idx, int val, int l, int r, int node) {
if (l == r) {
tree[node] = {0, val};
return;
}
int m = (l + r) / 2;
if (idx <= m) update(idx, val, l, m, 2*node);
else update(idx, val, m+1, r, 2*node+1);
merge(node);
}
void merge(int node) {
auto& L = tree[2*node];
auto& R = tree[2*node+1];
tree[node].dp0 = max(L.dp0, L.dp1) + max(R.dp0, R.dp1);
tree[node].dp1 = L.dp0 + R.dp0;
}
long long query() {
return max(tree[1].dp0, tree[1].dp1);
}
};
class Solution {
public:
int maximumSumSubsequence(vector<int>& nums, vector<vector<int>>& queries) {
SegmentTree st(nums);
long long ans = 0;
for (auto& q : queries) {
st.update(q[0], q[1], 0, nums.size()-1, 1);
ans = (ans + st.query()) % MOD;
}
return ans;
}
};
|