Submission

Status:

(PPPPPPPPPPPPP)(PPPPPPP)(PPPPPPPPP)

Subtask/Task Score:

{30/30}{30/30}{40/40}

Score: 100

User: Kittiponn

Problemset: Red Zone

Language: cpp

Time: 0.021 second

Submitted On: 2026-03-05 11:08:53

#include <bits/stdc++.h>
using namespace std;

#define ll long long
const int nx = 1e5+5;

ll n, m, l, d;
ll bo[nx], ho[nx], pr[nx], da[nx];

int solve(int md) {
    // 1. Reset arrays
    for(int i = 0; i <= n + 1; i++) pr[i] = 0, da[i] = 0;

    // 2. Difference Array Update
    for(int i = 0; i < md; i++) {
        // ปรับตำแหน่งระเบิดเป็น 0-based
        ll center = bo[i] - 1; 
        ll left = max(0LL, center - l);
        ll right = min(n - 1, center + l);
        
        pr[left] += d;
        if(right + 1 < n) pr[right + 1] -= d;
    }

    // 3. Prefix Sum
    da[0] = pr[0];
    for(int i = 1; i < n; i++) {
        da[i] = da[i - 1] + pr[i];
    }

    // 4. Check results
    for(int i = 0; i < n; i++) {
        if(ho[i] > da[i]) return 0; // เลือดยังเหลือ = ไม่ผ่าน
    }
    return 1;
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    
    if(!(cin >> n >> m >> l >> d)) return 0;
    for(int i = 0; i < n; i++) cin >> ho[i];
    for(int i = 0; i < m; i++) cin >> bo[i];

    int li = 0, r = m + 1;
    while(li < r) {
        int md = li + (r - li) / 2;
        if(solve(md)) r = md;
        else li = md + 1;
    }

    if(li == m + 1) cout << "-1";
    else cout << li;

    return 0;
}