#include<bits/stdc++.h>
using namespace std;
namespace IO
{
bool f;char buf[20],c;int slen;
template <typename T>
inline void rd(T &x)
{
x=0;f=0;c=getchar();
while(!isdigit(c)) {if(c=='-') f=1;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
x=f?-x:x;
}
template <typename T>
inline void wt(T x)
{
if(!x) putchar('0');if(x<0) x=-x,putchar('-');
while(x) buf[++slen]=x%10+48,x/=10;
while(slen) putchar(buf[slen--]);
}
}
using IO::rd;
using IO::wt;
typedef long long ll;
const int N=2e5+5,M=2e5+5;
int n,m,rt,op,x,y,tot,h[N],nxt[M],ver[M];
inline void add(int x,int y) {ver[++tot]=y,nxt[tot]=h[x],h[x]=tot;}
int dep[N],son[N],w[N],wl[N],f[N],sz[N],id[N],ind,top[N];
ll tag[N<<2],tr[N<<2],P,z;
inline void push_down(int p,int ln,int rn)
{
if(tag[p])
{
tag[p<<1]=(tag[p<<1]+tag[p])%P;
tag[p<<1|1]=(tag[p<<1|1]+tag[p])%P;
tr[p<<1]=(tr[p<<1]+tag[p]*ln)%P;
tr[p<<1|1]=(tr[p<<1|1]+tag[p]*rn)%P;
tag[p]=0;
}
}
void build(int p,int l,int r)
{
if(l==r)
{
tr[p]=w[l]%P;
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
tr[p]=(tr[p<<1]+tr[p<<1|1])%P;
}
void modify(int p,int l,int r,int x,int y,ll z)
{
if(l>=x && r<=y)
{
tr[p]=(tr[p]+z*(r-l+1))%P;
tag[p]=(tag[p]+z)%P;
return;
}
int mid=(l+r)>>1;
push_down(p,mid-l+1,r-mid);
if(mid>=x) modify(p<<1,l,mid,x,y,z);
if(mid<y) modify(p<<1|1,mid+1,r,x,y,z);
tr[p]=(tr[p<<1]+tr[p<<1|1])%P;
}
ll query(int p,int l,int r,int x,int y)
{
if(l>=x && r<=y) return tr[p];
int mid=(l+r)>>1;ll res=0;
push_down(p,mid-l+1,r-mid);
if(mid>=x) res=(res+query(p<<1,l,mid,x,y))%P;
if(mid<y) res=(res+query(p<<1|1,mid+1,r,x,y))%P;
return res;
}
inline ll qRange(int x,int y)
{
ll res=0;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
res=(res+query(1,1,n,id[top[x]],id[x]))%P;
x=f[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
return (res+query(1,1,n,id[x],id[y]))%P;
}
inline void mRange(int x,int y,ll z)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
modify(1,1,n,id[top[x]],id[x],z);
x=f[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
modify(1,1,n,id[x],id[y],z);
}
inline int qSon(int x) {return query(1,1,n,id[x],id[x]+sz[x]-1);}
inline void mSon(int x,ll z) {modify(1,1,n,id[x],id[x]+sz[x]-1,z);}
void dfs1(int x,int fa)
{
dep[x]=dep[fa]+1;
f[x]=fa,sz[x]=1;
for(int i=h[x];i;i=nxt[i])
{
int v=ver[i];
if(v==fa) continue;
dfs1(v,x);
sz[x]+=sz[v];
if(sz[v]>sz[son[x]]) son[x]=v;
}
}
void dfs2(int x,int topf)
{
id[x]=++ind;
w[ind]=wl[x];
top[x]=topf;
if(!son[x]) return;
dfs2(son[x],x);
for(int i=h[x];i;i=nxt[i])
if(ver[i]!=f[x] && ver[i]!=son[x]) dfs2(ver[i],ver[i]);
}
int main()
{
rd(n),rd(m),rd(rt),rd(P);
for(int i=1;i<=n;i++) rd(wl[i]);
for(int i=1;i<n;i++)
{
rd(x),rd(y);
add(x,y),add(y,x);
}
dfs1(rt,0);dfs2(rt,rt);build(1,1,n);
while(m--)
{
rd(op),rd(x);
if(op==1) rd(y),rd(z),mRange(x,y,z);
else if(op==2) rd(y),wt(qRange(x,y)),putchar('\n');
else if(op==3) rd(z),mSon(x,z);
else wt(qSon(x)),putchar('\n');
}
return 0;
}
真的感觉莫名其妙不知道哪里写错了,1AC, 3TLE, 6WA。有没有大佬帮忙看一下qwq