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
|
class SegmentTree {
vector<int> tree;
int n;
public:
SegmentTree(int size) : n(size), tree(4*size, -1) {}
void update(int idx, int val, int l, int r, int node) {
if (l == r) { tree[node] = max(tree[node], 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);
tree[node] = max(tree[2*node], tree[2*node+1]);
}
int query(int ql, int qr, int l, int r, int node) {
if (qr < l || ql > r) return -1;
if (ql <= l && r <= qr) return tree[node];
int m = (l + r) / 2;
return max(query(ql, qr, l, m, 2*node), query(ql, qr, m+1, r, 2*node+1));
}
};
class Solution {
public:
vector<int> maximumSumQueries(vector<int>& nums1, vector<int>& nums2, vector<vector<int>>& queries) {
int n = nums1.size(), q = queries.size();
vector<pair<int,int>> arr(n);
for (int i = 0; i < n; ++i) arr[i] = {nums1[i], nums2[i]};
sort(arr.begin(), arr.end(), greater<>());
vector<tuple<int,int,int>> qs(q);
for (int i = 0; i < q; ++i) qs[i] = {queries[i][0], queries[i][1], i};
sort(qs.begin(), qs.end(), greater<>());
vector<int> vals;
for (auto& [a, b] : arr) vals.push_back(b);
sort(vals.begin(), vals.end());
vals.erase(unique(vals.begin(), vals.end()), vals.end());
SegmentTree st(vals.size());
vector<int> ans(q, -1);
int j = 0;
for (auto& [xi, yi, idx] : qs) {
while (j < n && arr[j].first >= xi) {
int pos = lower_bound(vals.begin(), vals.end(), arr[j].second) - vals.begin();
st.update(pos, arr[j].first + arr[j].second, 0, vals.size()-1, 1);
++j;
}
int pos = lower_bound(vals.begin(), vals.end(), yi) - vals.begin();
if (pos < vals.size()) ans[idx] = st.query(pos, vals.size()-1, 0, vals.size()-1, 1);
}
return ans;
}
};
|