제출 #980477

#제출 시각아이디문제언어결과실행 시간메모리
980477abczzSprinkler (JOI22_sprinkler)C++14
41 / 100
4030 ms421352 KiB
#include <iostream>
#include <vector>
#define ll long long

using namespace std;

ll n, q, t, M, a, b, c, f, cnt, H[200000], edgeid[200000], P[200000], X[200000], dp[200000][41];
struct BIT{
  vector <ll> bit{vector <ll> (42, 1)};
  void mult(ll u, ll w) {
    u = 42-u;
    while (u < 42) {
      bit[u] = bit[u] * w % M;
      u += u & -u;
    }
  }
  ll query(ll u) {
    u = 42-u;
    ll res = 1;
    while (u) {
      res *= bit[u];
      res %= M;
      u -= u & -u;
    }
    return res;
  }
};
struct SegTree{
  vector <BIT> st;
  ll stsz = 0;
  void init() {
    st.resize(4*stsz);
  }
  void update(ll id, ll l, ll r, ll q, ll u, ll w) {
    st[id].mult(u, w);
    if (l == r) return;
    ll mid = (l+r)/2;
    if (q <= mid) update(id*2, l, mid, q, u, w);
    else update(id*2+1, mid+1, r, q, u, w);
  }
  ll query(ll id, ll l, ll r, ll ql, ll qr, ll u) {
    if (qr < l || r < ql || ql > qr) return 1;
    else if (ql <= l && r <= qr) return st[id].query(u);
    ll mid = (l+r)/2;
    return query(id*2, l, mid, ql, qr, u) * query(id*2+1, mid+1, r, ql, qr, u) % M;
  }
}ST[200000];
vector <ll> adj[200000];
BIT G[200000];

void dfs(ll u, ll p) {
  for (auto v : adj[u]) {
    if (v != p) {
      X[v] = ST[u].stsz++;
      edgeid[v] = cnt++;
      dfs(v, u);
      P[v] = u;
    }
  }
  ST[u].init();
}
int main() {
  cin >> n >> M;
  for (int i=0; i<n-1; ++i) {
    cin >> a >> b;
    --a, --b;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  for (int i=0; i<n; ++i) {
    cin >> H[i];
  }
  dfs(0, -1);
  P[0] = -1;
  cin >> q;
  while (q--) {
    cin >> t;
    if (t == 1) {
      cin >> a >> b >> c;
      --a;
      G[a].mult(b+1, c);
      for (int i=b-1; i>=0 && P[a] != -1; --i) {
        ST[P[a]].update(1, 0, ST[P[a]].stsz-1, X[a], i+1, c);
        a = P[a];
      }
    }
    else {
      cin >> a;
      --a;
      f = H[a] * G[a].query(1) % M;
      f = f * ST[a].query(1, 0, ST[a].stsz-1, 0, ST[a].stsz-1, 1) % M;
      for (int i=1; i<=40 && P[a] != -1; ++i) {
        f = f * G[P[a]].query(i+1) % M;
        f = f * ST[P[a]].query(1, 0, ST[P[a]].stsz-1, 0, X[a]-1, i+1) % M * ST[P[a]].query(1, 0, ST[P[a]].stsz-1, X[a]+1, ST[P[a]].stsz-1, i+1) % M;
        a = P[a];
      }
      cout << f << '\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...