#include<bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return f*x;
}
inline ll Lead()
{
ll x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return f*x;
}
int n,m,q,P[160010];
int fst[160010],nxt[320010],to[320010],cnt;
int dfn[160010],dcnt,siz[160010],dep[160010];
int st[160010][20],op[160010];
void link(int x,int y)
{
nxt[++cnt]=fst[x];
fst[x]=cnt;to[cnt]=y;
}
void dfs(int x)
{
dfn[x]=++dcnt;
siz[x]=1;
for(int i=fst[x];i;i=nxt[i])
{
if(dep[to[i]]!=0) continue;
dep[to[i]]=dep[x]+1;
st[to[i]][0]=x;
dfs(to[i]);
siz[x]+=siz[to[i]];
}
}
void makest()
{
for(int i=1;i<=18;i++)
{
for(int j=1;j<=n;j++)
{
st[j][i]=st[st[j][i-1]][i-1];
}
}
}
int calc(int x,int stp)
{
if(dep[x]<=stp) return 1;
for(int i=0;(1<<i)<=stp;i++)
{
if(stp&(1<<i)) x=st[x][i];
}
return x;
}
namespace Seg_Tree
{
#define lx (x<<1)
#define rx ((x<<1)|1)
int tag1[3020010],tag2[3020010];
void psd(int x)
{
if(tag1[x])
{
tag1[lx]=tag1[x];
tag1[rx]=tag1[x];
tag2[lx]=tag2[rx]=0;
tag1[x]=0;
}
if(tag2[x])
{
tag2[lx]+=tag2[x];
tag2[rx]+=tag2[x];
tag2[x]=0;
}
}
void mdf1(int x,int l,int r,int nl,int nr,int val)
{
if(r<l) return;
if(nl<=l&&r<=nr)
{
tag1[x]=val;tag2[x]=0;return;
}
psd(x);
int mid=(l+r)>>1;
if(nl<=mid) mdf1(lx,l,mid,nl,nr,val);
if(nr>mid) mdf1(rx,mid+1,r,nl,nr,val);
}
void mdf2(int x,int l,int r,int nl,int nr,int val)
{
if(r<l) return;
if(nl<=l&&r<=nr)
{
tag2[x]+=val;return;
}
psd(x);
int mid=(l+r)>>1;
if(nl<=mid) mdf2(lx,l,mid,nl,nr,val);
if(nr>mid) mdf2(rx,mid+1,r,nl,nr,val);
}
int qury(int x,int l,int r,int p)
{
if(l==r) return calc(tag1[x]==0?P[l]:tag1[x],tag2[x]);
psd(x);
int mid=(l+r)>>1;
if(p<=mid) return qury(lx,l,mid,p);
if(p>mid) return qury(rx,mid+1,r,p);
}
}
using namespace Seg_Tree;
namespace Fenwick_Tree
{
#define lowbit(x) (x&-x)
ll c1[160010],c2[160010];
void add1(int p,ll val){for(int i=p;i<=n;i+=lowbit(i)) c1[i]+=val;}
void add2(int p,ll val){for(int i=p;i<=n;i+=lowbit(i)) c2[i]+=val;}
ll qury1(int p){ll tmp=0;for(int i=p;i>0;i-=lowbit(i)) tmp+=c1[i];return tmp;}
ll qury2(int p){ll tmp=0;for(int i=p;i>0;i-=lowbit(i)) tmp+=c2[i];return tmp;}
}
using namespace Fenwick_Tree;
signed main()
{
freopen("robot3.in","r",stdin);
freopen("robot.out","w",stdout);
n=read();m=read();
for(int i=1;i<n;i++)
{
int x=read(),y=read();
link(x,y);link(y,x);
}
dep[1]=1;
dfs(1);makest();
for(int i=1;i<=m;i++) P[i]=read();
q=read();
for(int i=1;i<=q;i++)
{
int opt=read();
if(opt==3)
{
int x=read();
int now=qury(1,1,m,x);
op[now]=!op[now];
if(op[now]==1)add1(dfn[now],dep[now]),add2(dfn[now],1ll);
else add1(dfn[now],-dep[now]),add2(dfn[now],-1ll);
ll sum=qury1(dfn[now]+siz[now]-1)-qury1(dfn[now]);
ll num=qury2(dfn[now]+siz[now]-1)-qury2(dfn[now]);
printf("%lld
",sum-num*dep[now]);
continue;
}
int l=read(),r=read(),val=read();
if(opt==1) mdf1(1,1,m,l,r,val);
if(opt==2) mdf2(1,1,m,l,r,val);
}
}