Submission #521304

#TimeUsernameProblemLanguageResultExecution timeMemory
521304radalFile Paths (BOI15_fil)C++14
100 / 100
273 ms5756 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
//#pragma GCC target("avx2,fma")
#define rep(i,l,r) for (int i = l; i < r; i++)
#define repr(i,r,l) for (int i = r; i >= l; i--)
#define X first
#define Y second
#define pb push_back
#define endl '\n'
#define debug(x) cerr << #x << " : " << x << endl;
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pll;
const long long int N = 6e3+20,mod = 998244353,inf = 1e9+10,maxm = 2e6+10,sq = 1001;
inline int mkay(int a,int b){
    if (a+b >= mod) return a+b-mod;
    if (a+b < 0) return a+b+mod;
    return a+b;
}

inline int poww(int a,int k){
    int z = 1;
    while (k){
        if (k&1) z = 1ll*z*a%mod;
        a = 1ll*a*a%mod;
        k >>= 1;
    }
    return z;
}
int h[N],n,m,k,s,par[N],L[N];;
int cnt[maxm];
bool b[maxm];
vector<pll> adj[N];
bool ok[N];
void dfs2(int u,int v,int t){
    if (u <= n) cnt[h[u]-h[v]+s] += t;
    for (pll w : adj[u]) dfs2(w.X,v,t);
}
void dfs(int v){
    if (v <= n){
        b[h[v]] = 1;
        int w = v;
        while (w > -1){
            cnt[h[v]-h[w]+s]++;
            w = par[w];
        }
        dfs2(v,v,1);
    }
    else{
        if(k == h[v]) ok[v] = 1;
        rep(i,1,sq+1){
            if (ok[v]) break;
            if ((k-h[v])%i) continue;
            if (cnt[(k-h[v])/i] || cnt[i]){
                ok[v] = 1;
                break;
            }
        }
        return;
    }
    for(pll u : adj[v]){
        dfs(u.X);
    }
    dfs2(v,v,-1);
    int w = v;
    while (w > -1){
        cnt[h[v]-h[w]+s]--;
        w = par[w];
    }
}
int main(){
    ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0); 
    cin >> n >> m >> k >> s;
    s++;
    rep(i,1,n+1){
        int p,l;
        cin >> p >> l;
        par[i] = p;
        h[i] = h[p]+l+1;
        adj[p].pb({i,l+1});
    }
    rep(i,1,m+1){
        int p,l;
        cin >> p >> l;
        par[i+n] = p;
        h[i+n] = h[p]+l+1;
        L[i] = l;
        adj[p].pb({i+n,l+1});
    }
    par[0] = -1;
    dfs(0);
    rep(i,1,m+1){
        if (k  == h[i+n]){
            cout << "YES" << endl;
            continue;
        }
        int v = par[i+n];
        while (v >= 0){
            int t = s+h[i+n]-h[v];
            if (k >= t && b[k-t]){
                ok[i+n] = 1;
                break;
            }
            v = par[v];
        }
        if (ok[i+n]){
            cout << "YES" << endl;
            continue;
        }
        cout << "NO" << endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...