RT
#include <bits/stdc++.h>
//#define int long long
#define MAXN 200000
#define MAXM 500000
#define INF 1717986918400000000
#define gc getchar()
#define pc putchar
#define up(l,r,i) for(int i=l;i<=r;++i)
#define e(u,i) for(int i=hd[u];i;i=nxt[i])
using namespace std;
inline int rd(){
int ret=0,pos=1;char c=gc;
while(!isdigit(c) && c!='-') c=gc;
if(c=='-') pos=-1,c=gc;
while(isdigit(c)) ret=(ret<<3)+(ret<<1)+(c&15),c=gc;
return ret*pos;
}
inline void wrt(int x){
if(x<0) x=~x+1,putchar('-');
if(x>9) wrt(x/10);
putchar(x%10+'0');
}
int N,M,Rt,P;
int a[MAXN];
int hd[MAXN],to[MAXM],nxt[MAXM],cnt;
void add(int u,int v){nxt[++cnt]=hd[u];hd[u]=cnt;to[cnt]=v;}
void ADD(int U,int V){add(U,V);add(V,U);}
int dep[MAXN],fa[MAXN],siz[MAXN],son[MAXN],rnk[MAXN],dfn[MAXN],top[MAXN];
int tot;
void dfs1(int u,int f){
//cout<<"dfs1 : "<<u<<' '<<f<<"\n";
fa[u]=f;dep[u]=dep[f]+1;siz[u]=1;son[u]=-1;
e(u,i){
int v=to[i];
if(v==f) continue;
dfs1(v,u);
siz[u]+=siz[v];
if(son[u]==-1 || siz[v]>siz[son[u]]) son[u]=v;
}
}
void dfs2(int u,int t){
top[u]=t;
dfn[u]=++tot;
rnk[tot]=u;
if(son[u]==-1) return;
dfs2(son[u],t);
e(u,i){
int v=to[i];
if(v==fa[u] || v==son[u]) continue;
dfs2(v,v);
}
}
int LCA(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
return x;
}
int t[MAXN<<2],ls[MAXN<<2],rs[MAXN<<2],d[MAXN<<2],tg[MAXN<<2];
inline int L(int p){return p<<1;}
inline int R(int p){return p<<1|1;}
void pushup(int p){t[p]=t[L(p)]+t[R(p)];}
void build(int p,int l,int r){
ls[p]=l,rs[p]=r;d[p]=r-l+1;
if(l==r){t[p]=a[rnk[l]];return;}
int mid=(l+r)>>1;
build(L(p),l,mid);
build(R(p),mid+1,r);
pushup(p);
}
void spd(int p,int k){
tg[p]+=k;
t[p]+=k*d[p];
}
void pushdown(int p){
spd(L(p),tg[p]);
spd(R(p),tg[p]);
tg[p]=0;
}
void RA(int p,int l,int r,int k){
if(l<=ls[p] && r>=rs[p]){spd(p,k);return;}
pushdown(p);
int mid=(ls[p]+rs[p])>>1;
if(l<=mid) RA(L(p),l,r,k);
if(r>mid) RA(R(p),l,r,k);
pushup(p);
return;
}
int RQ(int p,int l,int r){
if(l<=ls[p] && r>=rs[p]){return t[p];}
pushdown(p);
int mid=(ls[p]+rs[p])>>1,ret=0;
if(l<=mid) ret+=RQ(L(p),l,r);
if(r>mid) ret+=RQ(R(p),l,r);
return ret;
}
void CA(int u,int v,int z){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
RA(1,dfn[top[u]],dfn[u],z);
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
RA(1,dfn[u],dfn[v],z);
}
int CQ(int u,int v){
int ret=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ret+=RQ(1,dfn[top[u]],dfn[u]);ret%=P;
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
ret+=RQ(1,dfn[u],dfn[v]);ret%=P;
return ret;
}
void TA(int x,int z){
RA(1,dfn[x],dfn[x]+siz[x]-1,z);
}
int TQ(int x){
return RQ(1,dfn[x],dfn[x]+siz[x]-1);
}
signed main(){
N=rd(),M=rd(),Rt=rd(),P=rd();
up(1,N,i) a[i]=rd();
up(1,N-1,i){int p=rd(),q=rd();ADD(p,q);}
dfs1(Rt,0),dfs2(Rt,Rt);
// up(1,N,i){
// cout<<i<<' '<<fa[i]<<' '<<dep[i]<<'\n';
// }
// cout<<endl;
build(1,1,N);
while(M--){
short op=rd();
if(op==1){
int x=rd(),y=rd(),z=rd();
CA(x,y,z%P);
}
if(op==2){
int x=rd(),y=rd();
wrt(CQ(x,y));pc('\n');
}
if(op==3){
int x=rd(),z=rd();
TA(x,z%P);
}
if(op==4){
int x=rd();
wrt(TQ(x));pc('\n');
}
}
}