Submission #1184122

#TimeUsernameProblemLanguageResultExecution timeMemory
1184122browntoadSprinkler (JOI22_sprinkler)C++20
100 / 100
445 ms56088 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast", "unroll-loops")
using namespace std;
#define ll long long 
// #define int ll
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, n) FOR(i, 0, n) 
#define REP1(i, n) FOR(i, 1, n+1)
#define RREP(i, n) for (int i = (n)-1; i >= 0; i--)
#define pii pair<int, int>
#define f first
#define s second
#define ALL(x) (x).begin(), (x).end()
#define SZ(x) (int)((x).size())
#define pb push_back
#define endl '\n'
#define IOS() ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)

const ll maxn = 2e5+45;
const int mxdis = 40;
int n, mod, q;
int phi;
vector<int> g[maxn];
vector<int> H(maxn), par(maxn);

ll pw(ll a, ll p){
    ll ret = 1;
    while(p > 0){
        if (p & 1){
            ret *= a;
            ret %= mod;
        }
        a *= a;
        a %= mod;
        p >>= 1;
    }
    return ret;
}
ll inv(ll a){
    return pw(a, phi-1);
}

void dfs(int u, int pre){
    par[u] = pre;
    for (auto v:g[u]){
        if (v == pre) continue;
        dfs(v, u);
    }
}

int dp[maxn][mxdis+5]; // enumerate lca of path, if dis(a, b) <= D_a, then some point higher = D_a or D_a-1
void modify(int U, int D, int W){
    REP(i, D+1){
        dp[U][D-i] = ((ll)(dp[U][D-i]) * W)%mod;
        if (D-i-1 >= 0) dp[U][D-i-1] = ((ll)(dp[U][D-i-1]) * W)%mod;
        U = par[U];
    }
}

int query(int U){
    ll A = H[U];
    REP(i, mxdis+1){
        A = (A * dp[U][i])%mod;
        U = par[U];
    }

    return A;
}

signed main(){
    IOS();
    cin>>n>>mod;
    REP(i, n-1){
        int u, v; cin>>u>>v;
        g[u].pb(v); g[v].pb(u);
    }

    REP(i, maxn) REP(j, mxdis+5) dp[i][j] = 1;

    FOR(i, n+1, n+mxdis+1){
        g[i-1].pb(i);
        g[i].pb(i-1);
    }
    int rt = n+mxdis;

    REP1(i, n) cin>>H[i];
    dfs(rt, -1);

    cin>>q;
    REP(i, q){
        int t; cin>>t;
        if (t == 1){
            int a, b, c; cin>>a>>b>>c;
            modify(a, b, c);
        }
        else{
            int x; cin>>x;
            cout<<query(x)<<endl;
        }
    }
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...