#include using namespace std; const int N=100005,mod=998244353,INF=0x3f3f3f3f; int head[N],cnt,a[N],sz[N],son[N],top[N],dfn[N],tot,Fa[N],deps[N],arr[N]; struct edge{ int v,next; }e[N<<1]; void add_edge(int u,int v){ e[cnt]=edge{v,head[u]}; head[u]=cnt++; } void DFS(int u,int fa){ sz[u]=1; son[u]=-1; Fa[u]=fa; for(int i=head[u];~i;i=e[i].next){ const int v=e[i].v; if(v==fa) continue; deps[v]=deps[u]+1; DFS(v,u); sz[u]+=sz[v]; if(son[u]==-1 || sz[son[u]]left=build(l,mid); p->right=build(mid,r); p->mn=min(p->left->mn,p->right->mn); return p; } void add_tag(node* p,int dis,AAA aa){ if(p==nullptr || (aa.k==1 && aa.b==0)) return; if(p->l+1==p->r && dis==0) p->val=calc(p->val,aa); p->tag[dis]=merge(p->tag[dis],aa); } void push_down(node* p){ if(p==nullptr) return; for(int i=0;i<12;++i){ if(p->tag[i].k==1 && p->tag[i].b==0) continue; if(i==11){ for(int j=max(0,p->mn+11-p->left->mn);j<12;++j) add_tag(p->left,j,p->tag[i]); for(int j=max(0,p->mn+11-p->right->mn);j<12;++j) add_tag(p->right,j,p->tag[i]); }else{ if(p->mn+i-p->left->mn>=0) add_tag(p->left,p->mn+i-p->left->mn,p->tag[i]); if(p->mn+i-p->right->mn>=0) add_tag(p->right,p->mn+i-p->right->mn,p->tag[i]); } p->tag[i]=AAA{1,0}; } } int query(node* p,int l,int r,int pos){ if(l+1==r) return p->val; push_down(p); int mid=l+(r-l)/2; if(posleft,l,mid,pos); return query(p->right,mid,r,pos); } void update(node* p,int L,int R,int l,int r,int deps,AAA aa){ if(l>=r) return; if(l<=L && R<=r){ if(deps==INF){ for(int i=0;i<12;++i) add_tag(p,i,aa); }else if(deps>=p->mn) add_tag(p,deps-p->mn,aa); return; } push_down(p); int mid=L+(R-L)/2; if(lleft,L,mid,l,r,deps,aa); if(r>mid) update(p->right,mid,R,l,r,deps,aa); } } int main(){ ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr); memset(head,255,sizeof(head)); int Sub,n,q; cin >> Sub >> n >> q; for(int i=0,u,v;i> u >> v; --u; --v; add_edge(u,v); add_edge(v,u); } for(int i=0;i> a[i]; deps[0]=0; DFS(0,-1); dfs(0,-1); seg::root=seg::build(0,n); while(q--){ int op,u,v,k,b,r; cin >> op; if(op==1){ cin >> u; --u; cout << seg::query(seg::root,0,n,dfn[u]) << '\n'; }else if(op==4){ cin >> u >> v >> k >> b; --u; --v; while(top[u]!=top[v]){ if(deps[top[u]]dfn[v]) swap(u,v); seg::update(seg::root,0,n,dfn[u],dfn[v]+1,INF,AAA{k,b}); }else if(op==3){ cin >> u >> k >> b; --u; seg::update(seg::root,0,n,dfn[u],dfn[u]+sz[u],INF,AAA{k,b}); }else{ cin >> u >> r >> k >> b; --u; for(int num=0;num<=r;++num){ if(num=0;--i) seg::update(seg::root,0,n,dfn[u],dfn[u]+sz[u],deps[u]+i,AAA{k,b}); break; }else{ seg::update(seg::root,0,n,dfn[u],dfn[u]+sz[u],deps[u]+r-num,AAA{k,b}); if(num