为什么样例都过不了啊QWQ
#include <bits/stdc++.h>
using namespace std;
struct node{
int to,next;
}edge[1000010 * 4];
struct seg_tree{
int l,r,tag,w;
}tree[1000010 * 4];
int fir[1000010],tot,root;
int n,m,r,mod,w[1000010];
int dep[1000010],res,fa[1000010],top[1000010],son[1000010];
int wt[1000010],id[1000010],size[1000010],cnt;
void pushdown(int num){
tree[num * 2].tag += tree[num].tag;
tree[num * 2 + 1].tag += tree[num].tag;
tree[num * 2].w = tree[num].tag * (tree[num * 2].r - tree[num * 2].l + 1);
tree[num * 2 + 1].w = tree[num].tag * (tree[num * 2 + 1].r - tree[num * 2 + 1].l + 1);
tree[num * 2].w %= mod;
tree[num * 2 + 1].w %= mod;
tree[num].tag = 0;
}
void add(int x,int y){
edge[++tot].to = y;
edge[tot].next = fir[x];
fir[x] = tot;
return;
}
void build(int num,int l,int r){
tree[num].l = l;tree[num].r = r;tree[num].tag = 0;
if(l == r){
tree[num].w = wt[num];
tree[num].w %= mod;
return;
}
int mid = (l + r) / 2;
build(num * 2,l,mid);
build(num * 2 + 1,mid + 1,r);
tree[num].w = tree[num * 2].w + tree[num * 2 + 1].w;
tree[num].w %= mod;
}
void ask(int num,int tar_l,int tar_r){
if(tree[num].l >= tar_l && tree[num].r <= tar_r){
res += tree[num].w;
res %= mod;
return;
}
if(tree[num].tag)
pushdown(num);
int mid = (tree[num].l + tree[num].r) / 2;
if(tar_l <= mid)
ask(num * 2,tar_l,tar_r);
if(tar_r > mid)
ask(num * 2 + 1,tar_l,tar_r);
}
void change(int num,int tar_l,int tar_r,int k){
if(tree[num].l >= tar_l && tree[num].r <= tar_r){
tree[num].tag += k;
tree[num].w += k * (tree[num].r - tree[num].l + 1);
tree[num].w %= mod;
return;
}
if(tree[num].tag)
pushdown(num);
int mid = (tree[num].l + tree[num].r) / 2;
if(tar_l <= mid)
change(num * 2,tar_l,tar_r,k);
if(mid < tar_r)
change(num * 2 + 1,tar_l,tar_r,k);
tree[num].w = tree[num * 2].w + tree[num * 2 + 1].w;
tree[num].w %= mod;
}
int ask_range(int x,int y){
int ans = 0;
while(top[x] != top[y]){
if(dep[top[x]] < dep[top[y]])swap(x,y);
res = 0;
ask(1,id[top[x]],id[x]);
ans += res;
ans %= mod;
x = fa[top[x]];
}
if(dep[x] > dep[y])swap(x,y);
res = 0;
ask(1,id[x],id[y]);
ans += res;
ans %= mod;
return ans;
}
void change_range(int x,int y,int k){
k %= mod;
while(top[x] != top[y]){
if(dep[top[x]] < dep[top[y]])swap(x,y);
change(1,id[top[x]],id[x],k);
x = fa[top[x]];
}
if(dep[x] > dep[y])swap(x,y);
change(1,id[x],id[y],k);
}
int ask_son(int x){
res = 0;
ask(1,id[x],id[x] + size[x] - 1);
return res;
}
void change_son(int x,int k){
change(1,id[x],id[x] + size[x] - 1,k);
}
void dfs1(int x,int f,int depth){
dep[x] = depth;
fa[x] = f;
size[x] = 1;
int heavyson_size = -1;
for(int i = fir[x];i;i = edge[i].next){
if(edge[i].to == f)continue;
dfs1(edge[i].to,x,depth + 1);
size[x] += size[edge[i].to];
if(size[edge[i].to] > heavyson_size){
heavyson_size = size[edge[i].to];
son[x] = edge[i].to;
}
}
}
void dfs2(int x,int topp){
id[x] = ++cnt;
wt[cnt] = w[x];
top[x] = topp;
if(!son[x])return;
dfs2(son[x],topp);
for(int i = fir[x];i;i = edge[i].next){
if(edge[i].to == fa[x] || edge[i].to == son[x])continue;
dfs2(edge[i].to,edge[i].to);
}
}
int main(){
scanf("%d%d%d%d",&n,&m,&root,&mod);
for(int i = 1;i <= n;i++)scanf("%d",&w[i]);
for(int i = 1;i < n;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs1(root,0,1);
dfs2(root,root);
build(1,1,n);
while(m--){
int k,x,y,z;
scanf("%d",&k);
if(k == 1){
scanf("%d%d%d",&x,&y,&z);
change_range(x,y,z);
}
else if(k == 2){
scanf("%d%d",&x,&y);
printf("%d\n",ask_range(x,y));
}
else if(k == 3){
scanf("%d%d",&x,&y);
change_son(x,y);
}
else{
int x;
scanf("%d",&x);
printf("%d\n",ask_son(x));
}
}
return 0;
}