想敲个模板,结果被制裁了。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=100001;
int n,m,r,mod,cnt,w[N],dep[N],fa[N],dfn[N],sz[N],ch[N],top[N];
vector<int>g[N];
struct segtree{
int tr[400001],tag[400001];
void update(int p){tr[p]=(tr[p*2]+tr[p*2+1])%mod;}
void f(int p,int l,int r,int c){
tr[p]+=(r-l+1)*c;
tag[p]+=c;
}
void pushdown(int p,int l,int r){
int mid=(l+r)/2;
f(p*2,l,mid,tag[p]);
f(p*2+1,mid+1,r,tag[p]);
tag[p]=0;
update(p);
}void set(int k,int c,int p=1,int x=1,int y=n){
if(x==y)return (tr[p]+=c)%=mod,void();
pushdown(p,x,y);
int mid=(x+y)/2;
if(k<=mid)set(k,c,p*2,x,mid);
else set(k,c,p*2+1,mid+1,y);
update(p);
}void apply(int l,int r,int c,int p=1,int x=1,int y=n){
if(l==x&&r==y)return f(p,l,r,c);
pushdown(p,x,y);
int mid=(x+y)/2;
if(r<=mid)apply(l,r,c,p*2,x,mid);
else if(l>mid)apply(l,r,c,p*2+1,mid+1,y);
else apply(l,mid,c,p*2,x,mid),apply(mid+1,r,c,p*2+1,mid+1,y);
update(p);
}int query(int l,int r,int p=1,int x=1,int y=n){
if(l==x&&r==y)return tr[p];
pushdown(p,x,y);
int mid=(x+y)/2;
if(r<=mid)return query(l,r,p*2,x,mid);
if(l>mid)return query(l,r,p*2+1,mid+1,y);
return (query(l,mid,p*2,x,mid)+query(mid+1,r,p*2+1,mid+1,y))%mod;
}
}s;
void init(int u){
sz[u]=1,dep[u]=dep[fa[u]]+1;
for(auto v:g[u]){
if(fa[u]!=v){
fa[v]=u;
init(v);
sz[u]+=sz[v];
if(sz[v]>sz[ch[u]])ch[u]=v;
}
}
}void dfs(int u,int t){
dfn[u]=++cnt,top[u]=t;
if(!ch[u])return;
dfs(ch[u],t);
for(auto v:g[u])if(fa[u]!=v&&ch[u]!=v)dfs(v,v);
}void modify(int x,int y,int z){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
s.apply(dfn[top[x]],dfn[x],z);
x=fa[top[x]];
}if(dep[x]<dep[y])swap(x,y);
s.apply(dfn[y],dfn[x],z);
}int query(int x,int y){
int res=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
(res+=s.query(dfn[top[x]],dfn[x]))%=mod;
x=fa[top[x]];
}if(dep[x]<dep[y])swap(x,y);
return (res+s.query(dfn[y],dfn[x]))%mod;
}signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m>>r>>mod;
for(int i=1;i<=n;++i)cin>>w[i];
for(int i=1,u,v;i<n;++i){
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}init(r),dfs(r,r);
for(int i=1;i<=n;++i)s.set(dfn[i],w[i]);
for(int i=1,t,x,y,z;i<=m;++i){
cin>>t;
if(t==1)cin>>x>>y>>z,modify(x,y,z);
else if(t==2)cin>>x>>y,cout<<query(x,y)<<'\n';
else if(t==3)cin>>x>>z,s.apply(dfn[x],dfn[x]+sz[x]-1,z);
else if(t==4)cin>>x,cout<<s.query(dfn[x],dfn[x]+sz[x]-1)<<'\n';
}
}