样例都没完全过......输出只对了 3 行......评测结果全 WA,看讨论区好像没有跟我一样错误的。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cctype>
using namespace std;
const int N = 3e5 + 5;
int d[N << 2], mx[N << 2];
int son[N], siz[N], fa[N], new_id[N], w[N], new_w[N], top[N], depth[N], cnt;
int n, q;
struct node
{
int to, nex;
};
node e[N << 1];
int head[N], tot;
namespace SP{
void add(int u, int v){
e[++tot].to = v;
e[tot].nex = head[u];
head[u] = tot;
}
void dfs1(int now, int fath){
fa[now] = fath;
depth[now] = depth[fath] + 1;
siz[now] = 1, son[now] = 0;
for(int i = head[now]; i; i = e[i].nex){
if(e[i].to != fa[now]){
dfs1(e[i].to, now);
siz[now] += siz[e[i].to];
if(siz[son[now]] < siz[e[i].to]){
son[now] = e[i].to;
}
}
}
}
void dfs2(int now, int topx){
top[now] = topx;
new_id[now] = ++cnt;
new_w[cnt] = w[now];
if(son[now])dfs2(son[now], topx);
else return ;
for(int i = head[now]; i; i = e[i].nex){
if(e[i].to != fa[now] && e[i].to != son[now])
dfs2(e[i].to, e[i].to);
}
}
}
namespace segt{
void pushup(int p){
d[p] = d[p << 1] + d[p << 1|1];
mx[p] = max(mx[p << 1], mx[p << 1|1]);
}
void update(int p, int l, int r, int u, int t){
if(l == r){
d[p] = t;
mx[p] = t;
return ;
}
int mid = l + ((r - l) >> 1);
if(u <= mid)update(p << 1, l, mid, u, t);
else update(p << 1|1, mid + 1, r, u, t);
pushup(p);
}
int QueryMax(int p, int l, int r, int x, int y){
int res = -N;
if(l >= x && r <= y){
return mx[p];
}
int mid = l + ((r - l) >> 1);
if(x <= mid)
res = max(res, QueryMax(p << 1, l, mid, x, y));
if(y > mid)
res = max(res, QueryMax(p << 1|1, mid + 1, r, x, y));
return res;
}
int QuerySum(int p, int l, int r, int x, int y){
int res = 0;
if(l >= x && r <= y){
return d[p];
}
int mid = l + ((r - l) >> 1);
if(x <= mid)
res += QuerySum(p << 1, l, mid, x, y);
if(y > mid)
res += QuerySum(p << 1|1, mid + 1, r, x, y);
return res;
}
int getMax(int x, int y){
int res = -N;
while(top[x] != top[y]){
if(top[x] < top[y])swap(x, y);
res = max(res, QueryMax(1, 1, n, new_id[top[x]], new_id[x]));
x = fa[top[x]];
}
if(new_id[x] > new_id[y])swap(x, y);
res = max(res, QueryMax(1, 1, n, new_id[x], new_id[y]));
return res;
}
int getsum(int x, int y){
int res = 0;
while(top[x] != top[y]){
if(top[x] < top[y])swap(x, y);
res += QuerySum(1, 1, n, new_id[top[x]], new_id[x]);
x = fa[top[x]];
}
if(new_id[x] > new_id[y])swap(x, y);
res += QuerySum(1, 1, n, new_id[x], new_id[y]);
return res;
}
}
int main(){
//freopen("code.in", "r", stdin);
//freopen("code.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n;
for(int i = 1; i <= n-1; i++){
int u, v;
cin >> u >> v;
SP::add(u, v), SP::add(v, u);
}
SP::dfs1(1, 0);
for(int i = 1; i <= n; i++){
cin >> w[i];
}
SP::dfs2(1, 1);
//cout << "------" <<endl;
cin >> q;
for (int i = 1; i <= q; i++) {
string s;
cin >> s;
if (s[0] == 'C') {
int u, t;
cin >> u >> t;
segt::update(1, 1, n, u, t);
} else if (s[1] == 'M') {
int u, v;
cin >> u >> v;
int ans = segt::getMax(u, v);
cout << ans << endl;
} else if (s[1] == 'S') {
int u, v;
cin >> u >> v;
int ans = segt::getsum(u, v);
cout << ans << endl;
}
}
return 0;
}