제출 #513439

#제출 시각아이디문제언어결과실행 시간메모리
513439wiwiho수확 (JOI20_harvest)C++14
5 / 100
5036 ms173812 KiB
#include <bits/stdc++.h>

#define mp make_pair
#define F first
#define S second
#define iter(a) a.begin(), a.end()
#define lsort(a) sort(iter(a))
#define gsort(a) sort(iter(a), greater<>())
#define eb emplace_back
#define printv(a, b) { \
    for(auto pv : a) b << pv << " "; \
    b << "\n"; \
}

using namespace std;

typedef long long ll;

using pii = pair<int, int>;
using pll = pair<ll, ll>;

ostream& operator<<(ostream& o, pll p){
    return o << '(' << p.F << ',' << p.S << ')';
}


int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int n, m;
    ll L, C;
    cin >> n >> m >> L >> C;

    vector<ll> a(n + 1), b(m + 1);
    vector<pll> ta(n + 1);
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        a[i] = L - a[i];
        if(a[i] == L) a[i] = 0;
        ta[i] = mp(a[i], i);
    }
    for(int i = 1; i <= m; i++){
        cin >> b[i];
        b[i] = L - b[i];
        if(b[i] == L) b[i] = 0;
    }
    lsort(a);
    lsort(b);
    lsort(ta);
    vector<int> id(n + 1);
    for(int i = 1; i <= n; i++){
        id[ta[i].S] = i;
    }

    //printv(a, cerr);
    //printv(b, cerr);

    vector<int> g(n + 1), gt(n + 1);

    for(int i = 1; i <= n; i++){
        ll tmp = a[i] + C;
        tmp %= L;
        auto it = lower_bound(a.begin() + 1, a.end(), tmp);
        if(it == a.end()) it = a.begin() + 1;
        int nxt = it - a.begin();
        g[i] = nxt;
        if(tmp <= a[nxt]) gt[i] = C + a[nxt] - tmp;
        else gt[i] = C + L - tmp + a[nxt];
    }

    //printv(g, cerr);
    //printv(gt, cerr);

    vector<vector<pll>> apple(n + 1);

    for(int i = 1; i <= m; i++){
        auto it = lower_bound(a.begin() + 1, a.end(), b[i]);
        if(it == a.end()) it = a.begin() + 1;
        int now = it - a.begin();

        vector<ll> arr(n + 1, -1), per(n + 1, -1);
        ll tm = (a[now] - b[i] + L) % L;
        while(true){
            if(arr[now] == -1) arr[now] = tm;
            else if(per[now] == -1) per[now] = tm - arr[now];
            else break;
            tm += gt[now];
            now = g[now];
        }

        for(int j = 1; j <= n; j++){
            if(arr[j] == -1) continue;
            apple[j].eb(mp(arr[j], per[j]));
        }

        /*cerr << "OAO " << i << "\n";
        printv(arr, cerr);
        printv(per, cerr);*/
    }

    /*for(int i = 1; i <= n; i++){
        printv(apple[i], cerr);
    }*/

    int q;
    cin >> q;
    while(q--){
        
        ll v, t;
        cin >> v >> t;
        v = id[v];

        ll ans = 0;
        for(pll i : apple[v]){
            if(i.F > t) continue;
            ans++;
            if(i.S != -1){
                ans += (t - i.F) / i.S;
            }
        }
        cout << ans << "\n";

    }
    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...