有7个点WA了,不知道为啥,数据太大不好调
求指导,提交记录:wa*7+ac*3,马蜂怪异轻喷(
#include <iostream>
#include <stdio.h>
#define maxn 100005
#define ll long long
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
using namespace std;
int n, m;
ll a[maxn];
struct edge {
int to, nxt;
} e[maxn << 1];
int p[maxn], eid = 0;
void addedge (int u, int v) {
e[++eid] = (edge){v, p[u]}, p[u] = eid;
e[++eid] = (edge){u, p[v]}, p[v] = eid;
}
int f[maxn], siz[maxn], d[maxn], son[maxn], top[maxn], id[maxn], rk[maxn];
void dfs (int u, int fa) {
siz[u] = 1;
for (int i = p[u]; i; i = e[i].nxt) {
int to = e[i].to;
if (to == fa) continue;
d[to] = d[u] + 1, f[to] = u;
dfs (to, u);
siz[u] += siz[to];
if (siz[to] > siz[son[u]]) son[u] = to;
}
}
int cnt = 0;
void dfs2 (int u, int tp) {
top[u] = tp, id[u] = ++cnt, rk[cnt] = u;
if (!son[u]) return ;
dfs2 (son[u], tp);
for (int i = p[u]; i; i = e[i].nxt) {
int to = e[i].to;
if (to == f[u] || to == son[u]) continue;
dfs2 (to, to);
}
}
ll sum[maxn << 2], add[maxn << 2];
void pushup (int rt) {
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
void pushdown (int rt, int l, int r, int mid) {
if (add[rt]) {
sum[rt<<1] += add[rt] * (mid-l+1), add[rt<<1] += add[rt];
sum[rt<<1|1] += add[rt] * (r-mid), add[rt<<1|1] += add[rt];
add[rt] = 0;
}
return ;
}
void build (int l, int r, int rt) {
if (l == r) {
sum[rt] = a[rk[l]], add[rt] = 0;
return ;
}
int mid = l + r >> 1;
build (ls), build(rs);
pushup (rt);
}
void update (int l, int r, int rt, int L, int R, ll x) {
if (L <= l && r <= R) {
sum[rt] += (r-l+1) * x, add[rt] += x;
return ;
}
int mid = l + r >> 1;
pushdown (rt, l, r, mid);
if (mid >= L) update (ls, L, R, x);
if (mid < R) update (rs, L, R, x);
pushup (rt);
}
ll query (int l, int r, int rt, int L, int R) {
if (L <= l && r <= R) {
return sum[rt];
}
int mid = l + r >> 1; ll res = 0;
pushdown (rt, l, r, mid);
if (mid >= L) res += query (ls, L, R);
if (mid < R) res += query (rs, L, R);
return res;
}
//void updates (int u, int v, ll x) {
// while (top[u] != top[v]) {
// if (d[top[u]] < d[top[v]]) swap (u, v);
// update (1, n, 1, id[top[u]], id[u], x);
// u = f[top[u]];
// }
// if (id[u] > id[v]) swap (u, v);
// update (1, n, 1, id[u], id[v], x);
//}
ll querys (int u, int v) {
ll res = 0;
while (top[u] != top[v]) {
if (d[top[u]] < d[top[v]]) swap (u, v);
res += query (1, n, 1, id[top[u]], id[u]);
u = f[top[u]];
}
if (id[u] > id[v]) swap (u, v);
return res + query (1, n, 1, id[u], id[v]);
}
int op, u; ll x;
int main () {
scanf ("%d %d", &n, &m);
for (int i = 1; i <= n; i++) scanf ("%d", a+i);
for (int i = 1, u, v; i < n; i++) {
scanf ("%d %d", &u, &v);
addedge (u, v);
}
dfs (1, 1);
dfs2 (1, 1);
build (1, n, 1);
while (m--) {
scanf ("%d %d", &op, &u);
if (op == 1) {
scanf ("%lld", &x);
update (1, n, 1, id[u], id[u], x);
} else if (op == 2) {
scanf ("%lld", &x);
update (1, n, 1, id[u], id[u] + siz[u] - 1, x);
} else {
printf ("%lld\n", querys (1, u));
}
}
return 0;
}