제출 #1038341

#제출 시각아이디문제언어결과실행 시간메모리
1038341SharkySprinkler (JOI22_sprinkler)C++17
100 / 100
714 ms110140 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

const int N = 200045;
const int K = 45;

int n, l, q, h[N], val[N][K], pa[N], dep[N];
vector<int> adj[N];

void dfs(int u, int p) {
    for (int v : adj[u]) if (v != p) {
        dep[v] = dep[u] + 1;
        pa[v] = u, dfs(v, u);
    }
}

int32_t main() {
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> n >> l;
    for (int i = 0; i < N; i++) for (int j = 0; j < K; j++) val[i][j] = 1;
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    pa[1] = 0;
    for (int i = n + 1; i <= n + 39; i++) {
        adj[i].push_back(i + 1);
        adj[i + 1].push_back(i);
    }
    adj[n + 40].push_back(1);
    adj[1].push_back(n + 40);
    dfs(n + 1, -1);
    for (int i = 1; i <= n; i++) cin >> h[i];
    cin >> q;
    while (q--) {
        int ty;
        cin >> ty;
        if (ty == 1) {
            int u, d, w;
            cin >> u >> d >> w;
            d = min(d, dep[u]);
            vector<int> tr;
            for (int j = 0; j <= d; j++) tr.push_back(u), u = pa[u];
            reverse(tr.begin(), tr.end());
            int dp = 0;
            val[tr[0]][0] = (val[tr[0]][0] * w) % l;
            // cout << "upd " << tr[0] << " " << 0 << " " << w << "\n";
            for (auto x : tr) {
                if (x == tr[0]) continue;
                // cout << "x: " << x << '\n';
                val[x][dp] = (val[x][dp] * w) % l;
                val[x][dp + 1] = (val[x][dp + 1] * w) % l;
                // cout << "upd " << x << " " << dp << "\n";
                // cout << "upd " << x << " " << dp + 1 << '\n';
                ++dp;
            }
        } else {
            int u;
            cin >> u;
            int ans = h[u];
            for (int i = 0; i <= 40; i++) {
                ans *= val[u][i];
                ans %= l;
                u = pa[u];
                if (!u) break;
            }
            cout << ans << '\n';
        }
    }
}
#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...