#include<bits/stdc++.h>
using namespace std;
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid ((l+r)>>1)
const int N= int(1e5)+17;
typedef long long ll;
int n,q,cnt=0;
ll vis[N],sta[N],_end[N],id[N],idd[N],a[N],f[N];
vector<int>e[N];
struct node{
ll lz,cnt,mi;
friend node operator + (node x,node y){
if(x.mi==y.mi) return (node){0,x.cnt+y.cnt,x.mi};
else if(x.mi<y.mi) return (node){0,x.cnt,x.mi};
else return (node){0,y.cnt,y.mi};
}
}t[N<<2];
void pd(int rt){
t[ls].lz+=t[rt].lz;t[rs].lz+=t[rt].lz;
t[ls].mi+=t[rt].lz;t[rs].mi+=t[rt].lz;
t[rt].lz=0;
}
void pushup(int rt){
t[rt]=t[ls]+t[rs];
}
void add(int rt,int l,int r,int ql,int qr,ll val){
if(ql<=l&&r<=qr){
t[rt].lz+=val;
t[rt].mi+=val;
return;
}
pd(rt);
if(ql<=mid) add(ls,l,mid,ql,qr,val);
if(mid<qr) add(rs,mid+1,r,ql,qr,val);
pushup(rt);
}
void modify(int rt,int l,int r,int id,ll val){
if(l==r){
t[rt].cnt=val;
return;
}
pd(rt);
if(id<=mid) modify(ls,l,mid,id,val);
else modify(rs,mid+1,r,id,val);
pushup(rt);
}
void dfs(int u,int fa){
cnt++;sta[u]=cnt;
id[cnt]=u;idd[u]=cnt;
vis[u]=1;
for(int i=0;i<e[u].size();i++){
int to=e[u][i];
if(to==fa||vis[to]) continue;
dfs(to,u);
}
_end[u]=cnt;
}
void build(int rt,int l,int r){
if(l==r){
t[rt].mi=0;
t[rt].cnt=a[id[l]];
t[rt].lz=0;
return;
}
build(ls,l,mid);build(rs,mid+1,r);
pushup(rt);
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//freopen("lys.in","r",stdin);
cin>>n>>q;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;e[u].push_back(v);e[v].push_back(u);
}
for(int i=1;i<=n;i++) cin>>a[i];
dfs(1,0);
build(1,1,n);
for(int i=1;i<=q;i++){
int op;
cin>>op;
if(op==1){
int x,y;cin>>x>>y;
modify(1,1,n,idd[x],y);
}
else {
int x;
cin>>x;
if(f[x]==0) add(1,1,n,sta[x],_end[x],1);
else add(1,1,n,sta[x],_end[x],-1);
f[x]^=1;
}
if(t[1].mi==0) cout<<t[1].cnt<<endl;
else cout<<0<<endl;
}
}