#include #include #include #include #include using namespace std; using mint=atcoder::modint998244353; mint op(mint a,mint b){return a;} mint e(){return mint::raw(0);} using F=pair; mint mp(F f,mint x){return f.first*x+f.second;} F cmp(F f,F g){return make_pair(f.first*g.first,f.first*g.second+f.second);} F id(){return make_pair(mint::raw(1),mint::raw(0));} int N,Q; vectorG[100000]; int ch[100000],pr[100000],depth[100000]; void dfs_init(int u,int p,int d) { pr[u]=p; depth[u]=d; if(p!=-1) { for(int i=0;i+1V; int inv[100000]; int up[100000]; int cL[100000],cR[100000]; int vL[100000],vR[100000]; void dfs(int u,int hld_p) { up[u]=hld_p; sort(G[u].begin(),G[u].end(),[](int l,int r){return ch[l]>ch[r];}); vL[u]=V.size(); if(!G[u].empty()) {//heavy-edge int v=G[u][0]; inv[v]=V.size(); V.push_back(v); dfs(G[u][0],hld_p); } //light-edge cL[u]=V.size(); for(int i=1;i>N>>Q; for(int i=1;i>a>>b; a--,b--; G[a].push_back(b); G[b].push_back(a); } dfs_init(0,-1,0); inv[0]=0; V.push_back(0); dfs(0,0); vectorinit(N); for(int i=0;i>x; init[inv[i]]=mint::raw(x); } atcoder::lazy_segtreeseg(init); for(int i=0;i>op; if(op==1) { int v;cin>>v;v--; cout<>v>>k>>c>>d;v--; F f=make_pair(mint::raw(c),mint::raw(d)); seg.set(inv[v],mp(f,seg.get(inv[v]))); if(pr[v]!=-1)seg.set(inv[pr[v]],mp(f,seg.get(inv[pr[v]]))); if(!G[v].empty())seg.set(inv[G[v][0]],mp(f,seg.get(inv[G[v][0]]))); seg.apply(cL[v],cR[v],f); } else if(op==3) { int v,c,d; cin>>v>>c>>d;v--; F f=make_pair(mint::raw(c),mint::raw(d)); seg.set(inv[v],mp(f,seg.get(inv[v]))); seg.apply(vL[v],vR[v],f); } else { int u,v,c,d; cin>>u>>v>>c>>d;u--,v--; F f=make_pair(mint::raw(c),mint::raw(d)); while(true) { if(inv[u]>inv[v])swap(u,v); seg.apply(max(inv[up[v]],inv[u]),inv[v]+1,f); if(up[u]!=up[v])v=pr[up[v]]; else break; } } } }