#include <bits/stdc++.h>
using namespace std;
const int maxn=30001;
int summ,f[maxn],d[maxn],size[maxn],id[maxn],first[maxn]
,to[maxn],nxt[maxn],tot,son[maxn],top[maxn],rk[maxn],arr[maxn],n,m,q,r;
struct t
{
int add,val;
}tre[maxn];
void up(int k)
{
if(tre[k].add!=0)
{
tre[k*2].add+=tre[k].add;
tre[k*2].val+=tre[k].add;
tre[k*2+1].add+=tre[k].add;
tre[k*2+1].val+=tre[k].add;
tre[k].add=0;
}
}
int read()
{
int x=0,w=1;
char c;
for(;c<'0'||c>'9';c=getchar())
{
if(c=='-')
w=-1;
}
for(;c>='0'&&c<='9';c=getchar())
{
x=x*10+c-'0';
}
return x*w;
}
void add(int u,int v)
{
tot++;
nxt[tot]=first[u];
first[u]=tot;
to[tot]=v;
}
void dfs1(int u,int fa)
{
d[u]=d[fa]+1;
f[u]=fa;
size[u]=1;
for(int e=first[u];e;e=nxt[e])
{
int v=to[e];
if(v!=fa)
{
dfs1(v,u);
size[u]+=size[v];
if(size[son[u]]<size[v])
{
son[u]=v;
}
}
}
}
void dfs2(int u,int fa)
{
if(son[u])
{
id[son[u]]=++id[0];
top[son[u]]=top[u];
rk[id[0]]=son[u];
dfs2(son[u],u);
}
for(int e=first[u];e;e=nxt[e])
{
int v=to[e];
if(!top[v])
{
top[v]=v;
id[v]=++id[0];
rk[id[0]]=v;
dfs2(v,u);
}
}
}
void build(int k,int l,int r)
{
if(l==r)
{
tre[k].val=arr[rk[l]];
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build((k<<1)+1,mid+1,r);
tre[k].val=tre[k<<1].val+tre[(k<<1)+1].val;
}
void ch(int k,int l,int r,int x,int y,int val)
{
if(r<x||l>y)
return ;
if(x<=l&&y>=r)
{
tre[k].val+=val;
tre[k].add+=val;
return;
}
up(k);
int mid=(l+r)>>1;
if(mid>=x)
ch(k<<1,l,mid,x,y,val);
if(mid+1<=y)
ch((k<<1)+1,mid+1,r,x,y,val);
tre[k].val=tre[k<<1].val+tre[(k<<1)+1].val;
}
void qf(int k,int l,int r,int a,int b)
{
if(l>b||r<a)
return;
if(a<=l&&b>=r)
{
summ+=tre[k].val;
return ;
}
up(k);
int mid=(l+r)>>1;
if(mid>=l)
qf(k<<1,l,mid,a,b);
if(mid+1<=r)
qf((k<<1)+1,mid+1,r,a,b);
}
void ask(int u,int v)
{
int fu=top[u],fv=top[v];
while(fu!=fv)
{
if(d[fu]<d[fv])
{
swap(fu,fv);
swap(u,v);
}
qf(1,1,id[0],id[fu],id[u]);
u=f[fu];
fu=top[u];
}
if(d[u]>d[v])
swap(u,v);
qf(1,1,id[0],id[u],id[v]);
}
int main()
{
n=read(),m=read(),r=read(),q=read();
int a,b,c,aa;
for(int i=1;i<=n;i++)
{
arr[i]=read();
}
for(int i=1;i<n;i++)
{
a=read(),b=read();
add(a,b);
add(b,a);
}
dfs1(r,0);
id[0]=1,id[r]=1,top[r]=r,rk[1]=r;
dfs2(r,0);
build(1,1,id[0]);
for(int i=1;i<=m;i++)
{
aa=read();
if(aa==1)
{
a=read(),b=read(),c=read();
ch(1,1,id[0],id[a],id[b],c);
}
else if(aa==2)
{
summ=0;
a=read(),b=read();
ask(a,b);
cout<<summ<<endl;
}
else if(aa==3)
{
a=read(),b=read();
ch(1,1,id[0],id[a],id[a]+size[a]-1,b);
}
else
{
a=read();
summ=0;
ask(a,rk[id[a]+size[a]-1]);
cout<<summ<<endl;
}
}
return 0;
}