不是 lz 怎么这么菜啊,连 RE 都看不出来,甚至还是样例 RE(
code:
#include<bits/stdc++.h>
using namespace std;
constexpr int N=1e5+5;
struct node{
int tag,sum;
}t[N<<2];
vector<int> tr[N];
int a[N],siz[N],fa[N],dep[N],son[N],dfn[N],top[N],cnt,n,q,r,mod;
void build(int u,int l,int r){
if(l==r) t[u].sum=a[l]%mod;
else{
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
t[u].sum=(t[u<<1].sum+t[u<<1|1].sum)%mod;
}
}
void pushdown(int x,int l,int r){
if(t[x].tag){
int mid=l+r>>1;
t[x<<1].sum=(t[x<<1].sum+(mid-l+1)*t[x].tag)%mod;
t[x<<1].tag=(t[x<<1].tag+t[x].tag)%mod;
t[x<<1|1].sum=(t[x<<1|1].sum+(r-mid)*t[x].tag)%mod;
t[x<<1|1].tag=(t[x<<1|1].tag+t[x].tag)%mod;
t[x].tag=0;
}
}
void update(int ql,int qr,int x,int l=1,int r=n,int u=1){
if(ql<=l&&r<=qr){
t[u].tag=(t[u].tag+x)%mod;
t[u].sum=(t[u].sum+(r-l+1)*x)%mod;
}
else{
int mid=l+r>>1;
pushdown(u,l,r);
if(mid>=ql) update(ql,qr,x,l,mid,u<<1);
if(qr>=mid+1) update(ql,qr,x,mid+1,r,u<<1|1);
t[u].sum=(t[u<<1].sum+t[u<<1|1].sum)%mod;
}
}
int query(int ql,int qr,int l=1,int r=n,int u=1){
if(ql<=l&&r<=qr) return t[u].sum%mod;
pushdown(u,l,r);
int ans=0,mid=l+r>>1;
if(mid>=ql) ans=(ans+query(ql,qr,l,mid,u<<1))%mod;
if(qr>=mid+1) ans=(ans+query(ql,qr,mid+1,r,u<<1|1))%mod;
return ans;
}
void dfs1(int x,int f=0,int de=1){
fa[x]=f,siz[x]=1,dep[x]=de;
for(auto &i:tr[x])
if(i!=f){
dfs1(i,x,de+1),siz[x]+=siz[i];
if(siz[i]>siz[son[x]]) son[x]=i;
}
}
void dfs2(int x,int tp){
dfn[x]=++cnt,top[x]=tp;
if(son[x]){
dfs2(son[x],tp);
for(auto &i:tr[x])
if(i!=fa[x]&&i!=son[x])
dfs2(i,i);
}
}
inline int qsum(int x){return query(dfn[x],dfn[x]+siz[x]-1)%mod;}
inline void usum(int x,int u){update(dfn[x],dfn[x]+siz[x]-1,u);}
inline int qpath(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]]) swap(x,y);
ans=(ans+query(dfn[top[x]],dfn[x]))%mod;
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
return (ans+query(dfn[x],dfn[y]))%mod;
}
inline void upath(int x,int y,int u){
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]]) swap(x,y);
update(dfn[top[x]],dfn[x],u);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
update(dfn[x],dfn[y],u);
}
void init(){dfs1(r);dfs2(r,r);build(1,1,n);}
int main(){
ios::sync_with_stdio(false),cin.tie(nullptr);
int op,x,y,u,v;
cin>>n>>q>>r>>mod;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<n;i++) cin>>u>>v,tr[u].push_back(v),tr[v].push_back(u);
init();
while(q--){
cin>>op>>x;
if(op==1) cin>>y>>u,upath(x,y,u);
else if(op==2) cin>>y,cout<<qpath(x,y)<<"\n";
else if(op==3) cin>>u,usum(x,u);
else cout<<qsum(x)<<"\n";
}
return 0;
}