实测开O2有60分(还有4个T),但是树剖就是这么写的啊为什么会TLE呢,
#include<cstdio>
#define max(a,b) (a>b?a:b)
#define swap(a,b) (a^=b^=a^=b)
using namespace std;
const int M=1e5+5;
inline int read(){
char c=getchar();int x=0,f=1;
for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(;c<='9'&&c>='0';c=getchar())x=(x<<1)+(x<<3)+(c^48);
return f=-1?-x:x;
}
inline void print(int x){
if(x<0)putchar('-'),x=-x;
if(x>9)print(x/10);
putchar(x%10+48);
}
int n,m,w[M];
//=======================================================
struct edge{
int v,nxt;
}ed[M];
int head[M],cnt_edge;
inline void add_edge(int u,int v){
ed[++cnt_edge]=(edge){v,head[u]};
head[u]=cnt_edge;
}
//======================================================
int size[M],dep[M],son[M],fa[M],id[M],wt[M],top[M],cnt_id;
inline void dfs1(int u,int f,int deep){
dep[u]=deep,fa[u]=f,size[u]=1;
int maxson=-1;
for(int i=head[u];i;i=ed[i].nxt){
int v=ed[i].v;
if(v!=f){
dfs1(v,u,deep+1);
size[u]+=size[v];
size[v]>maxson?maxson=size[v],son[u]=v:1;
}
}
}
inline void dfs2(int u,int topf){
top[u]=topf,id[u]=++cnt_id,wt[cnt_id]=w[u];
if(son[u]){
dfs2(son[u],topf);
for(int i=head[u];i;i=ed[i].nxt){
int v=ed[i].v;
if(v!=fa[u]&&v!=son[u]){
dfs2(v,v);
}
}
}
}
//======================================================
struct tree{
int l,r,v,x;//x是最大值,v是和
}t[M<<2];
inline void push_up(int k){
t[k].v=t[k<<1].v+t[k<<1|1].v;
t[k].x=max(t[k<<1].x,t[k<<1|1].x);
}
inline void build(int l,int r,int k){
t[k].l=l;
t[k].r=r;
if(l==r){
t[k].x=t[k].v=wt[l];
return ;
}
int mid=l+r>>1;
build(l,mid,k<<1);
build(mid+1,r,k<<1|1);
push_up(k);
}
inline void update(int v,int x,int k){
if(t[k].l==t[k].r&&t[k].l==x){
t[k].v=v;
t[k].x=v;
return ;
}
int mid=t[k].l+t[k].r>>1;
if(x<=mid)update(v,x,k<<1);
else update(v,x,k<<1|1);
push_up(k);
}
inline int query_sum(int l,int r,int k){
if(l<=t[k].l&&t[k].r<=r){
return t[k].v;
}
int ans=0;
int mid=t[k].l+t[k].r>>1;
if(l<=mid)ans+=query_sum(l,r,k<<1);
if(r>mid)ans+=query_sum(l,r,k<<1|1);
return ans;
}
inline int query_max(int l,int r,int k){
if(l<=t[k].l&&t[k].r<=r){
return t[k].x;
}
int ans=-0x3f3f3f3f;
int mid=t[k].l+t[k].r>>1;
if(l<=mid)ans=max(ans,query_max(l,r,k<<1));
if(r>mid)ans=max(ans,query_max(l,r,k<<1|1));
return ans;
}
//======================================================
inline int query_range_sum(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]){
swap(x,y);
}
ans+=query_sum(id[top[x]],id[x],1);
x=fa[top[x]];
}
if(dep[x]>dep[y]){
swap(x,y);
}
ans+=query_sum(id[x],id[y],1);
return ans;
}
inline int query_range_max(int x,int y){
int ans=-0x3f3f3f3f;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]){
swap(x,y);
}
ans=max(ans,query_max(id[top[x]],id[x],1));
x=fa[top[x]];
}
if(dep[x]>dep[y]){
swap(x,y);
}
ans=max(ans,query_max(id[x],id[y],1));
return ans;
}
//======================================================
int main(){
n=read();
for(int i=1;i<n;i++){
int u=read(),v=read();
add_edge(u,v),add_edge(v,u);
}
for(int i=1;i<=n;i++)w[i]=read();
dfs1(1,0,1);
dfs2(1,1);
build(1,cnt_id,1);
m=read();
for(int i=1;i<=m;i++){
char s[10];
scanf("%s",s);
if(s[1]=='M'){
int x=read(),y=read();
print(query_range_max(x,y)),puts("");
}
else if(s[1]=='S'){
int x=read(),y=read();
print(query_range_sum(x,y)),puts("");
}
else {
int x=read(),v=read();
update(v,id[x],1);
}
}
return 0;
}