#include<bits/stdc++.h>
#define N 100005
using namespace std;int n,m,r,mod,cnt,in[N],f[N],d[
N],sz[N],son[N],top[N],dfn[N],rnk[N];vector<int>g[
N];struct node{int l,r,sum,lz;}seg[4*N];int ls(int
p){return 2*p;}int rs(int p){return 2*p+1;}void push_down(
int p){seg[ls(p)].lz=(seg[ls(p)].lz+seg[p].lz)%mod;seg[
rs(p)].lz=(seg[rs(p)].lz+seg[p].lz)%mod;seg[ls(p)]
.sum=(seg[ls(p)].sum+(seg[ls(p)].r-seg[ls(p)].l+1)
*seg[p].lz%mod)%mod;seg[rs(p)].sum=(seg[rs(p)].sum+
(seg[rs(p)].r-seg[rs(p)].l+1)*seg[p].lz%mod)%mod;seg[
p].lz=0;}void dfs1(int u,int fa){f[u]=fa;d[u]=d[fa]
+1;sz[u]=1;for(int i=0;i<g[u].size();i++){int v=g[
u][i];if(v==fa)continue;dfs1(v,u);sz[u]+=sz[v];if(
sz[son[u]]<sz[v])son[u]=v;}}void dfs2(int u,int _top)
{top[u]=_top;dfn[u]=++cnt;rnk[cnt]=u;if(son[u])dfs2(
son[u],_top);for(int i=0;i<g[u].size();i++){int v=g[
u][i];if(v==f[u]||v==son[u])continue;dfs2(v,v);}}void
build(int p,int l,int r){seg[p].l=l;seg[p].r=r;if(
l==r){seg[p].sum=in[rnk[l]]%mod;return;}int mid=(l+
r)>>1;build(ls(p),l,mid);build(rs(p),mid+1,r);seg[
p].sum=(seg[ls(p)].sum+seg[rs(p)].sum)%mod;}void update(
int p,int l,int r,int k){if(seg[p].l>r||seg[p].r<l)
return;if(seg[p].l>=l&&seg[p].r<=r){seg[p].lz=(seg[
p].lz+k)%mod;seg[p].sum=(seg[p].sum+(seg[p].r-seg[
p].l+1)*k%mod)%mod;return;}push_down(p);update(ls(
p),l,r,k);update(rs(p),l,r,k);seg[p].sum=(seg[ls(p)
].sum+seg[rs(p)].sum)%mod;}int query(int p,int l,int
r){if(seg[p].l>r||seg[p].r<l)return 0;if(seg[p].l>=l&&seg[
p].r<=r)return seg[p].sum;push_down(p);return (query(
ls(p),l,r)+query(rs(p),l,r))%mod;}void add(int x,int
y,int z){while(top[x]!=top[y]){if(d[top[x]]<d[top[
y]])swap(x,y);update(1,dfn[top[x]],dfn[x],z);x=f[top[
x]];}if(d[x]>d[y])swap(x,y);update(1,dfn[x],dfn[y]
,z);}int get(int x,int y){int rel=0;while(top[x]!=top[
y]){if(d[top[x]]<d[top[y]])swap(x,y);rel=(rel+query(
1,dfn[top[x]],dfn[x]))%mod;x=f[top[x]];}if(d[x]>d[
y])swap(x,y);rel=(rel+query(1,dfn[x],dfn[y]))%mod;return
rel;}int main(){cin>>n>>m>>r>>mod;for(int i=1;i<=n;i++)
cin>>in[i];for(int i=1;i<n;i++){int x,y;cin>>x>>y;g[
x].push_back(y);g[y].push_back(x);}dfs1(r,0);dfs2(
r,r);build(1,1,n);for(int i=1;i<=m;i++){int op,x,y,z;cin>>op;if(
op==1){cin>>x>>y>>z;add(x,y,z);}if(op==2){cin>>x>>y;cout<<get(
x,y)<<endl;}if(op==3){cin>>x>>z;update(1,dfn[x],dfn[
x]+sz[x]-1,z);}if(op==4){cin>>x;cout<<query(1,dfn[
x],dfn[x]+sz[x]-1)<<endl;}}return 0;}
上述代码为什么能编译?