제출 #925321

#제출 시각아이디문제언어결과실행 시간메모리
925321alexddSprinkler (JOI22_sprinkler)C++17
100 / 100
844 ms104136 KiB
#include<bits/stdc++.h> #pragma GCC optimize("O3,unroll-loops") using namespace std; #define int long long int n,MOD; int h[200005]; vector<int> con[200005]; int parent[200005]; int inm[200005][45]; int depth[200005]; void dfs(int nod) { for(auto adj:con[nod]) { if(adj!=parent[nod]) { depth[adj]=depth[nod]+1; parent[adj]=nod; dfs(adj); } } for(int d=0;d<=42;d++) inm[nod][d]=1; } int getrez(int nod) { int prod=1; for(int i=0;i<=40;i++) { if(nod==0) break; prod=prod*inm[nod][i]%MOD; nod=parent[nod]; } return prod; } signed main() { ios_base::sync_with_stdio(0);cin.tie(0); cin>>n>>MOD; //phi = calc_phi(MOD); int a,b; for(int i=1;i<n;i++) { cin>>a>>b; con[a].push_back(b); con[b].push_back(a); } depth[1]=1; dfs(1); for(int i=1;i<=n;i++) { cin>>h[i]; } int cntq,tip,d; cin>>cntq; for(int pas=1;pas<=cntq;pas++) { cin>>tip; if(tip==1) { cin>>a>>d>>b; int cur=a; for(int i=0;i<=d;i++) { if(cur==0) break; ///j > -1 + d - (i+1) int lim=0; if(parent[cur]!=0) lim=max(lim,d-i-1); for(int j=lim;j<=d-i;j++) { inm[cur][j]=(inm[cur][j]*b)%MOD; } cur = parent[cur]; } } else { cin>>a; cout<<(1LL*h[a]*getrez(a))%MOD<<"\n"; //cout<<h[a]<<" "<<qry_brut(pos[a])<<" zzz\n"; } } return 0; }
#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...