那个数组的越界和取模先不用管。。。
#include<bits/stdc++.h>
using namespace std;
struct node{int to,next;};
node bian[10010];int head[10010];
int fath[10010],dep[10010],size[10010],son[10010];
int top[10010],seg[10010],rev[10010];
int n,m,r,p,cnt,a[10010];
int tree[10010*4],summ;
void add(int x,int y){
cnt++;
bian[cnt].to=y;
bian[cnt].next=head[x];
head[x]=cnt;
}
void dfs1(int r,int x){
fath[x]=r;
dep[x]=dep[r]+1;
size[x]=1;
for(int k=head[x];k;k=bian[k].next){
if(bian[k].to!=r){
dfs1(x,bian[k].to);
size[x]+=size[bian[k].to];
if(size[bian[k].to]>size[son[x]])son[x]=bian[k].to;
}
}
}
void dfs2(int r,int x){
if(son[x]){
seg[son[x]]=++seg[0];
top[son[x]]=top[x];
rev[seg[son[x]]]=son[x];
dfs2(x,son[x]);
}
for(int k=head[x];k;k=bian[k].next){
if(top[bian[k].to]==0){
seg[bian[k].to]=++seg[0];
top[bian[k].to]=bian[k].to;
rev[seg[bian[k].to]]=bian[k].to;
dfs2(x,bian[k].to);
}
}
}
void build(int i,int l,int r){
if(l==r){
tree[i]=a[rev[l]];
return ;
}
int mid=(l+r)/2;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
tree[i]=tree[i*2]+tree[i*2+1];
}
void query(int k,int l,int r,int x,int y){
if(x>r||y<l)return ;
if(x<=l&&y>=r){
summ+=tree[k];
return ;
}
int mid=(l+r)/2;
if(mid>=x)query(k*2,l,mid,x,y);
if(mid+1<=y)query(k*2+1,mid+1,r,x,y);
}
void change(int k,int l,int r,int x,int y,int v){
if(x>r||y<l)return ;
if(x<=l&&y>=r){
tree[k]+=v*(r-l+1);
return ;
}
int mid=(l+r)/2;
if(mid>=x)query(k*2,l,mid,x,y);
if(mid+1<=y)query(k*2+1,mid+1,r,x,y);
}
void ask(int x,int y){
int fx=top[x],fy=top[y];
while(fx!=fy){
if(dep[fx]<dep[fy])swap(fx,fy),swap(x,y);
query(1,1,seg[0],seg[x],seg[fx]);
x=fath[fx],fx=top[x];
}
if(dep[x]>dep[y])swap(x,y);
query(1,1,seg[0],seg[x],seg[y]);
}
void changetop(int x,int y,int z){
int fx=top[x],fy=top[y];
while(fx!=fy){
if(dep[fx]<dep[fy])swap(fx,fy),swap(x,y);
change(1,1,seg[0],seg[x],seg[fx],z);
x=fath[fx],fx=top[x];
}
if(dep[x]>dep[y])swap(x,y);
change(1,1,seg[0],seg[x],seg[y],z);
}
void changetree(int x,int z){
change(1,1,seg[0],seg[x],seg[x]+size[x]-1,z);
}
void asktree(int x){
query(1,1,seg[0],seg[x],seg[x]+size[x]-1);
}
int main(){
cin>>n>>m>>r>>p;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n-1;i++){
int x,y;
cin>>x>>y;
add(x,y);add(y,x);
}
dfs1(0,r);
dfs2(0,r);
for(int i=1;i<=m;i++){
int flag,x,y,z;
cin>>flag;
if(flag==1){
cin>>x>>y>>z;
changetop(x,y,z);
}
else if(flag==2){
cin>>x>>y;summ=0;
ask(x,y);
cout<<summ<<endl;
}
else if(flag==3){
cin>>x>>z;
changetree(x,z);
}
else if(flag==4){
cin>>x;summ=0;
asktree(x);
cout<<summ<<endl;
}
}
return 0;
}