Taystered @ 2024-07-07 16:24:15
#include<bits/stdc++.h>
#define ls (p<<1)
#define rs (ls|1)
#define mid ((l+r)>>1)
using namespace std;
const int N=1e5+5;
int dep[N],son[N],dad[N],size[N],top[N],rev[N],id[N],a[N],sum[N<<2],tag[N<<2],n,m,R,mod,t;
vector <int> e[N];
int add(int x,int y) {return (x+y)%mod;}
void dfs(int x)
{
dep[x]=dep[dad[x]]+1,size[x]=1;
for (int y:e[x]) if (y^dad[x])
dad[y]=x,dfs(y),size[x]+=size[y],
son[x]=(size[y]>size[son[x]]?y:son[x]);
}
void dfs(int x,int S)
{
top[x]=S,id[x]=++t,rev[t]=x;
if (son[x]) dfs(son[x],S);
for (int y:e[x]) if (y^dad[x] && y^son[x]) dfs(y,y);
}
void update(int p,int l,int r,int v) {tag[p]=add(tag[p],v),sum[p]=add(sum[p],(r-l+1ll)*v%mod);}
void pushdown(int p,int l,int r) {update(ls,l,mid,tag[p]),update(rs,mid+1,r,tag[p]),tag[p]=0;}
void build(int p,int l,int r)
{
if (l==r) return update(p,l,r,a[rev[l]]);
build(ls,l,mid),build(rs,mid+1,r);
sum[p]=add(sum[ls],sum[rs]);
}
void modify(int p,int l,int r,int x,int y,int v)
{
if (x<=l && r<=y) return update(p,l,r,v);
pushdown(p,l,r);
if (y<=mid) return modify(ls,l,mid,x,y,v);
if (x>mid) return modify(rs,mid+1,r,x,y,v);
modify(ls,l,mid,x,y,v),modify(rs,mid+1,r,x,y,v);
sum[p]=add(sum[ls],sum[rs]);
}
int query(int p,int l,int r,int x,int y)
{
if (x<=l && r<=y) return sum[p];
pushdown(p,l,r);
if (y<=mid) return query(ls,l,mid,x,y);
if (x>mid) return query(rs,mid+1,r,x,y);
return add(query(ls,l,mid,x,y),query(rs,mid+1,r,x,y));
}
void modify(int x,int y,int v)
{
for (;top[x]^top[y];x=dad[top[x]])
{
if (dep[top[x]]<dep[top[y]]) swap(x,y);
modify(1,1,n,id[top[x]],id[x],v);
}
if (dep[x]>dep[y]) swap(x,y);
modify(1,1,n,id[x],id[y],v);
}
int query(int x,int y)
{
int res=0;
for (;top[x]^top[y];x=dad[top[x]])
{
if (dep[top[x]]<dep[top[y]]) swap(x,y);
res=add(res,query(1,1,n,id[top[x]],id[x]));
}
if (dep[x]>dep[y]) swap(x,y);
res=add(res,query(1,1,n,id[x],id[y]));
return res;
}
void modify(int x,int v) {modify(1,1,n,id[x],id[x]+size[x]-1,v);}
int query(int x) {return query(1,1,n,id[x],id[x]+size[x]-1);}
int main()
{
freopen("input.in","r",stdin);
scanf("%d%d%d%d",&n,&m,&R,&mod);
for (int i=1;i<=n;++i) scanf("%d",&a[i]),a[i]%=mod;
for (int i=1,u,v;i<n;++i)
scanf("%d%d",&u,&v),
e[u].emplace_back(v),
e[v].emplace_back(u);
dfs(R),dfs(R,R),build(1,1,n);
for (int i=1,op,x,y,v;i<=m;++i)
{
scanf("%d",&op);
if (op==1) scanf("%d%d%d",&x,&y,&v),v%=mod,modify(x,y,v);
if (op==2) scanf("%d%d",&x,&y),printf("%d\n",query(x,y));
if (op==3) scanf("%d%d",&x,&v),v%=mod,modify(x,v);
if (op==4) scanf("%d",&x),printf("%d\n",query(x));
}
}
by run_away @ 2024-07-07 16:55:00
@Taystered size不是有系统函数吗?
by Taystered @ 2024-07-07 16:58:47
@run_away 不是吧 我把size define掉还是一样