Submission
Status:
----------
Subtask/Task Score:
0/100
Score: 0
User: yourmom
Problemset: ความลึก
Language: cpp
Time: 0.029 second
Submitted On: 2026-10-03 15:09:59
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, Q;
cin >> N >> Q;
vector<int> depth(N);
vector<long long> len(N);
int cur = 1, maxd = 1;
for (int i = 0; i < N; i++) {
int D, L;
cin >> D >> L;
cur += D;
depth[i] = cur;
len[i] = L;
maxd = max(maxd, cur);
}
// maxw[h] = ความยาวต่อเนื่องยาวสุดที่ depth >= h
vector<long long> maxw(maxd + 2, 0);
// ใช้ stack หาช่วงที่ใหญ่ที่สุดที่ depth[i] เป็นค่าต่ำสุด
vector<int> L(N), R(N); // ขอบซ้าย-ขวา
vector<long long> sum(N + 1, 0); // prefix sum ของความยาว
for (int i = 0; i < N; i++) sum[i + 1] = sum[i] + len[i];
// หาขอบซ้าย
stack<int> st;
for (int i = 0; i < N; i++) {
while (!st.empty() && depth[st.top()] >= depth[i]) st.pop();
L[i] = st.empty() ? 0 : st.top() + 1;
st.push(i);
}
// หาขอบขวา
while (!st.empty()) st.pop();
for (int i = N - 1; i >= 0; i--) {
while (!st.empty() && depth[st.top()] >= depth[i]) st.pop();
R[i] = st.empty() ? N - 1 : st.top() - 1;
st.push(i);
}
// อัปเดต maxw
for (int i = 0; i < N; i++) {
long long width = sum[R[i] + 1] - sum[L[i]];
maxw[depth[i]] = max(maxw[depth[i]], width);
}
// แพร่ค่าจากสูงลงต่ำ
for (int h = maxd - 1; h >= 1; h--) {
maxw[h] = max(maxw[h], maxw[h + 1]);
}
// ตอบคำถาม
while (Q--) {
long long W;
cin >> W;
int lo = 0, hi = maxd;
while (lo < hi) {
int mid = (lo + hi + 1) / 2;
if (maxw[mid] >= W) lo = mid;
else hi = mid - 1;
}
cout << lo << '\n';
}
return 0;
}