我的代码
#include<bits/stdc++.h>
#define p(i) ++i
#define ri register int
#define lt(x) (x<<1)
#define rt(x) (x<<1|1)
using namespace std;
const int N=3e4+7;
inline int read() {
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
int first[N],t=1,hs[N],size[N],tot,top[N],back[N],w[N],dfn[N],fa[N],n,dep[N];
struct edge{
int v,nxt;
}e[N<<1];
struct Segmenttree{
int mx,s;
}tree[N<<2];
inline void add(int u,int v) {
e[t].v=v;
e[t].nxt=first[u];
first[u]=t++;
}
void dfs1(int x,int f) {
fa[x]=f;
size[x]=1;
for (ri i(first[x]);i;i=e[i].nxt) {
int v=e[i].v;
if (v==f) continue;
dep[v]=dep[x]+1;
dfs1(v,x);
size[x]+=size[v];
if (size[v]>size[hs[x]]) hs[x]=v;
}
}
void dfs2(int x,int tp) {
top[x]=tp;
dfn[x]=p(tot);
back[tot]=x;
if (hs[x]) dfs2(hs[x],tp);
for (ri i(first[x]);i;i=e[i].nxt) {
int v=e[i].v;
if (v==hs[x]||v==fa[x]) continue;
dfs2(v,v);
}
}
inline void up(int x){tree[x].s=tree[lt(x)].s+tree[rt(x)].s;tree[x].mx=max(tree[lt(x)].mx,tree[rt(x)].mx);}
void build(int l,int r,int id) {
if (l==r) {tree[id].mx=tree[id].s=w[back[l]];return;}
int mid=(l+r)>>1;
build(l,mid,lt(id));
build(mid+1,r,rt(id));
up(id);
}
int querymx(int l,int r,int lt,int rt,int id) {
if (l<=lt&&rt<=r) return tree[id].mx;
int res=INT_MIN,mid=(lt+rt)>>1;
if (l<=mid) res=max(res,querymx(l,r,lt,mid,lt(id)));
if (r>mid) res=max(res,querymx(l,r,mid+1,rt,rt(id)));
return res;
}
int querys(int l,int r,int lt,int rt,int id) {
if (l<=lt&&rt<=r) return tree[id].s;
int res=0,mid=(lt+rt)>>1;
if (l<=mid) res+=querys(l,r,lt,mid,lt(id));
if (r>mid) res+=querys(l,r,mid+1,rt,rt(id));
return res;
}
void update(int x,int lt,int rt,int id,int k) {
if (lt==rt&<==x) {tree[id].mx=tree[id].s=k;return;}
int mid=(lt+rt)>>1;
if (x<=mid) update(x,lt,mid,lt(id),k);
else update(x,mid+1,rt,rt(id),k);
up(id);
}
int qmax(int x,int y) {
int res=INT_MIN;
while(top[x]!=top[y]) {
if (dep[top[x]]<dep[top[y]]) swap(x,y);
res=max(res,querymx(dfn[top[x]],dfn[x],1,n,1));
x=fa[top[x]];
}
if (dep[x]<dep[y]) swap(x,y);
res=max(res,querymx(dfn[y],dfn[x],1,n,1));
return res;
}
int qsum(int x,int y) {
int res=0;
while(top[x]!=top[y]) {
if (dep[top[x]]<dep[top[y]]) swap(x,y);
res+=querys(dfn[top[x]],dfn[x],1,n,1);
x=fa[top[x]];
}
if (dep[x]<dep[y]) swap(x,y);
res+=querys(dfn[y],dfn[x],1,n,1);
return res;
}
int main() {
//freopen("1.in","r",stdin);
n=read();
for (ri i(1);i<n;p(i)) {
int u=read(),v=read();
add(u,v);add(v,u);
}
dfs1(1,0);
dfs2(1,1);
for (ri i(1);i<=n;p(i)) w[i]=read();
build(1,n,1);
int q=read();
for (ri i(1);i<=q;p(i)) {
char c=getchar(),h=getchar();
int u=read(),v=read();
if (c=='Q'&&h=='M') printf("%d\n",qmax(u,v));
else if (c=='C') update(dfn[u],1,n,1,v);
else printf("%d\n",qsum(u,v));
}
return 0;
}
本机和darkbzoj都没问题