#include <bits/stdc++.h>
using namespace std;
class SegmentTree {
public:
vector<int> tree;
int n;
SegmentTree(int _n) : n(_n), tree(4 * _n, 0) {}
void build(int node, int start, int end, vector<int>& arr) {
if (start == end) {
tree[node] = arr[start];
return;
}
int mid = (start + end) / 2;
build(2 * node, start, mid, arr);
build(2 * node + 1, mid + 1, end, arr);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
int find_leftmost(int node, int start, int end, int l, int r, int val) {
if (l > end || r < start) return -1;
if (l <= start && end <= r) {
if (tree[node] < val) return -1;
if (start == end) return start;
int mid = (start + end) / 2;
int p1 = find_leftmost(2 * node, start, mid, l, r, val);
if (p1 != -1) return p1;
return find_leftmost(2 * node + 1, mid + 1, end, l, r, val);
}
int mid = (start + end) / 2;
int p1 = find_leftmost(2 * node, start, mid, l, r, val);
if (p1 != -1) return p1;
return find_leftmost(2 * node + 1, mid + 1, end, l, r, val);
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, K;
cin >> N >> K;
vector<int> Ai(N), Bi(N);
long long sum = 0;
for (int i = 0; i < N; i++) {
cin >> Ai[i] >> Bi[i];
}
vector<int> T(K);
for (int i = 0; i < K; i++) {
cin >> T[i];
}
SegmentTree st(K);
st.build(1, 0, K - 1, T);
for (int i = 0; i < N; i++) {
long long current = Ai[i];
int prev = -1;
while (true) {
int next = st.find_leftmost(1, 0, K - 1, prev + 1, K - 1, current);
if (next == -1) break;
current = Ai[i] + Bi[i] - current;
prev = next;
}
sum += current;
}
cout << sum << endl;
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |