#include using namespace std; const int N=1e5+5,K=10,P=998244353; typedef vector vi; typedef vector > vii; #define eb emplace_back int n,m,va[N]; int sz[N],son[N],dp[N],seg[N],rev[N],fa[N],tp[N]; vi e[N],g[N]; vii sub[N],ks[N][K+1]; int t1[N<<2],t2[N<<2]; inline int md(int x){ return x>=P?x-P:x; } #define L k<<1 #define R k<<1|1 void build(int k,int l,int r){ t1[k]=1,t2[k]=0; if(l==r){ t2[k]=va[rev[l]]; return; } int mid=l+r>>1; build(L,l,mid),build(R,mid+1,r); } void pusht1(int k,int v){ t2[k]=1ll*t2[k]*v%P,t1[k]=1ll*t1[k]*v%P; } void pusht2(int k,int v){ t2[k]=md(t2[k]+v); } void pushdown(int k){ if(t1[k]!=1){ pusht1(L,t1[k]); pusht1(R,t1[k]); t1[k]=1; } if(t2[k]){ pusht2(L,t2[k]); pusht2(R,t2[k]); t2[k]=0; } } void modify(int k,int l,int r,int x,int y,int c,int d){ if(x<=l&&r<=y)return pusht1(k,c),pusht2(k,d); int mid=l+r>>1; pushdown(k); if(x<=mid)modify(L,l,mid,x,y,c,d); if(y>mid)modify(R,mid+1,r,x,y,c,d); } int ask(int k,int l,int r,int x){ if(l==r)return t2[k]; int mid=l+r>>1; pushdown(k); if(x<=mid)return ask(L,l,mid,x); else return ask(R,mid+1,r,x); } void upd(vii &a){ vii b; sort(a.begin(),a.end()); for(auto v:a){ if(!b.empty()&&b.back().second+1==v.first)b.back().second=v.second; else b.eb(v); } a=b; } void dfs1(int x){ sz[x]=1; for(auto v:e[x])if(!sz[v]){ dp[v]=dp[x]+1,fa[v]=x; g[x].eb(v); dfs1(v); sz[x]+=sz[v]; if(sz[v]>sz[son[x]])son[x]=v; } } void dfs2(int x){ vi s1,s2; for(int i=x;i;i=son[i])s1.eb(i),tp[i]=x; for(int i=0;i<=K;++i){ for(auto v:s1){ if(!seg[v])seg[v]=++seg[0],rev[seg[0]]=v; for(auto w:g[v])s2.eb(w); } s1=s2,s2.clear(); } for(int i=x;i;i=son[i])for(auto v:g[i])if(v!=son[i])dfs2(v); } void dfs3(int x){ sub[x].eb(seg[x],seg[x]),ks[x][0].eb(seg[x],seg[x]); for(auto v:g[x]){ dfs3(v); for(auto w:sub[v])sub[x].eb(w); for(int i=0;i=-y;--j){ if(fa[nw]&&dp[x]+dp[x]+j-2*dp[fa[nw]]<=y)nw=fa[nw]; for(auto v:ks[nw][dp[x]+j-dp[nw]])a.eb(v); } upd(a); Chg(a,c,d); } void Chg3(int x,int c,int d){ Chg(sub[x],c,d); } void getl(vii &a,int y,int x){ int u=y; while(seg[u]+dp[x]-dp[u]!=seg[x])a.eb(seg[u],seg[u]),u=son[u]; a.eb(seg[u],seg[x]); } void Chg4(int x,int y,int c,int d){ vii a; for(int fx=tp[x],fy=tp[y];fx!=fy;x=fa[fx],fx=tp[x]){ if(dp[fx]