#include <bits/stdc++.h>
using namespace std;
class SegmentTree {
public:
vector<int> tree;
int n;
SegmentTree(vector<int>& arr) {
n = arr.size();
tree.assign(4 * n, 0);
if (n > 0) build(1, 0, n - 1, arr);
}
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 query(int node, int start, int end, int l, int r) {
if (r < start || end < l) return INT_MIN;
if (l <= start && end <= r) return tree[node];
int mid = (start + end) / 2;
int p1 = query(2 * node, start, mid, l, r);
int p2 = query(2 * node + 1, mid + 1, end, l, r);
if (p1 == INT_MIN) return p2;
if (p2 == INT_MIN) return p1;
return max(p1, p2);
}
int get_max(int l, int r) {
return query(1, 0, n - 1, l, r);
}
};
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];
sum += Ai[i];
}
vector<int> T(K);
for (int i = 0; i < K; i++) {
cin >> T[i];
}
SegmentTree seg(T);
for (int i = 0; i < N; i++) {
int current = Ai[i];
int prev_j = -1;
while (true) {
int L = prev_j + 1;
if (L >= K) break;
if (seg.get_max(L, K - 1) < current) break;
int low = L;
int high = K - 1;
int ans = -1;
while (low <= high) {
int mid = (low + high) / 2;
if (seg.get_max(L, mid) >= current) {
ans = mid;
high = mid - 1;
} else {
low = mid + 1;
}
}
if (ans == -1) break;
prev_j = ans;
int other = Ai[i] + Bi[i] - current;
sum += other - current;
current = other;
}
}
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... |