A了5和6,其他M
#include<bits/stdc++.h>
using namespace std;
typedef short int si;
const si N = 30010;
si idx,nxt[N * 2],d[N * 2],h[N * 2];
si dep[N],top[N],fa[N],son[N],siz[N];
si dfn[N],wz[N],d1,w[N];
struct nd
{
si sum;
si maxn;
}tree[N * 2];
si n,m,s;
void add(si x,si y)
{
idx++;
d[idx] = y;
nxt[idx] = h[x];
h[x] = idx;
}
void dfs(si x,si deep,si da)
{
fa[x] = da;
dep[x] = deep;
si gs = 1;
for(si i = h[x];i;i = nxt[i])
{
if(d[i] == da)
continue;
dfs(d[i],deep + 1,x);
gs += siz[d[i]];
if(siz[d[i]] > siz[son[x]])
son[x] = d[i];
}
siz[x] = gs;
}
void dfs1(si x,si to)
{
top[x] = to;
if(!son[x])
return ;
dfn[++d1] = son[x];
wz[son[x]] = d1;
dfs1(son[x],to);
for(si i = h[x];i;i = nxt[i])
{
if(d[i] == fa[x] || d[i] == son[x])
continue;
dfn[++d1] = d[i];
wz[d[i]] = d1;
dfs1(d[i],d[i]);
}
}
void build(si now,si l,si r)
{
if(l == r)
{
tree[now].sum = tree[now].maxn = w[dfn[l]];
return ;
}
if(l > r)
return ;
si mid = (l + r) >> 1;
build(now * 2,l,mid);
build(now * 2 + 1,mid + 1,r);
tree[now].maxn = max(tree[now * 2].maxn,tree[now * 2 + 1].maxn);
tree[now].sum = tree[now * 2].sum + tree[now * 2 + 1].sum;
}
void change(si now,si l,si r,si aim,si num)
{
if(l == r && l == wz[aim])
{
tree[now].sum = tree[now].maxn = num;
return ;
}
if(l > r)
return ;
si mid = (l + r) >> 1;
if(aim <= mid)
change(now * 2,l,mid,aim,num);
else
change(now * 2 + 1,mid + 1,r,aim,num);
tree[now].maxn = max(tree[now * 2].maxn,tree[now * 2 + 1].maxn);
tree[now].sum = tree[now * 2].sum + tree[now * 2 + 1].sum;
}
si find_ma(si now,si l,si r,si al,si ar)
{
if(al <= l && r <= ar)
return tree[now].maxn;
if(ar < l || r < al)
return -32000;
si mid = (l + r) >> 1;
return max(find_ma(now * 2,l,mid,al,ar),find_ma(now * 2 + 1,mid + 1,r,al,ar));
}
si find_su(si now,si l,si r,si al,si ar)
{
if(al <= l && r <= ar)
return tree[now].sum;
if(ar < l || r < al)
return 0;
si mid = (l + r) >> 1;
return find_su(now * 2,l,mid,al,ar) + find_su(now * 2 + 1,mid + 1,r,al,ar);
}
si ask_max(si x,si y)
{
si ans = -INT_MAX;
while(top[x] != top[y])
{
if(dep[top[x]] < dep[top[y]])
swap(x,y);
ans = max(ans,find_ma(s,1,n,wz[top[x]],wz[x]));
x = fa[top[x]];
}
if(dep[x] > dep[y])
swap(x,y);
ans = max(ans,find_ma(s,1,n,wz[x],wz[y]));
return ans;
}
si ask_sum(si x,si y)
{
si ans = 0;
while(top[x] != top[y])
{
if(dep[top[x]] < dep[top[y]])
swap(x,y);
ans += find_su(s,1,n,wz[top[x]],wz[x]);
x = fa[top[x]];
}
if(dep[x] > dep[y])
swap(x,y);
ans += find_su(s,1,n,wz[x],wz[y]);
return ans;
}
int main()
{
si t,t1;
cin >> n;
s = 1;
for(si i = 1;i < n;i++)
{
scanf("%d %d",&t,&t1);
add(t,t1);
add(t1,t);
}
for(si i = 1;i <= n;i++)
scanf("%d",&w[i]);
dfs(s,1,0);
dfn[++d1] = s;
wz[s] = d1;
dfs1(s,s);
// for(si i = 1;i <= n;i++)
// cout << wz[i] << " ";
// return 0;
build(1,1,n);
cin >> m;
string tt;
for(si i = 1;i <= m;i++)
{
cin >> tt;
scanf("%d %d",&t,&t1);
switch(tt[1])
{
case 'H':
change(1,1,n,wz[t],t1);
break;
case 'M':
printf("%d\n",ask_max(t,t1));
break;
case 'S':
printf("%d\n",ask_sum(t,t1));
break;
}
}
return 0;
}
到底为什么啊啊啊啊我又不是m