MLE原因未知,如何处理?
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ldb long double
template<typename T>
inline void read(T &x){
bool f=1; x=0; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=!f; ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch-'0'); ch=getchar();}
x=(f?x:-x); return ;
}
template<typename T>
inline void print(T x){
if(x<0) {putchar('-'); x=-x;}
if(x>9) print(x/10);
putchar(x%10+'0'); return ;
}
//以 1 为根
const int N=30010;
int n,l,r,op,head[N],val[N];
struct node {int nxt,to;} edge[N<<1];
void add(int l,int r){
edge[++op].nxt=head[l]; edge[op].to=r;
head[l]=op; return ;
}
int cnt;
int dep[N],par[N],son[N],siz[N];
int top[N],cid[N],ccid[N];
void dfs1(int id){
siz[id]=1;
for(int i=head[id];i;i=edge[i].nxt){
if(edge[i].to==par[id]) continue;
par[edge[i].to]=id;
dep[edge[i].to]=dep[id]+1;
dfs1(edge[i].to);
if(siz[son[id]]<siz[edge[i].to]) son[id]=edge[i].to;
siz[id]=siz[id]+siz[edge[i].to];
}
return ;
}
void dfs2(int id){
if(son[id])
{
top[son[id]]=top[id];
cnt++; cid[son[id]]=cnt; ccid[cnt]=son[id];
dfs2(son[id]);
}
for(int i=head[id];i;i=edge[i].nxt){
if(edge[i].to==par[id]||edge[i].to==son[id]) continue;
top[edge[i].to]=edge[i].to;
cnt++; cid[edge[i].to]=cnt; ccid[cnt]=edge[i].to;
dfs2(edge[i].to);
}
return ;
}
int sum[N<<2],maxx[N<<2];
void build(int k,int l,int r){
if(l==r) {sum[k]=maxx[k]=val[ccid[l]]; return ;}
int mid=(l+r)>>1;
build(k<<1,l,mid); build((k<<1)|1,mid+1,r);
sum[k]=sum[k<<1]+sum[(k<<1)|1];
maxx[k]=max(maxx[k<<1],maxx[(k<<1)|1]);
return ;
}
int q,u,v;
string s;
void change(int k,int l,int r,int p,int val){
if(l==r) {sum[k]=maxx[k]=val; return ;}
int mid=(l+r)>>1;
if(mid>=p) change(k<<1,l,mid,p,val);
if(mid<p) change((k<<1)|1,mid+1,r,p,val);
sum[k]=sum[k<<1]+sum[(k<<1)|1];
maxx[k]=max(maxx[k<<1],maxx[(k<<1)|1]);
return ;
}
int get_max(int k,int l,int r,int lhs,int rhs){
if(l>=lhs&&r<=rhs) return maxx[k];
int mid=(l+r)>>1,ans=-3e5;
if(mid>=lhs) ans=max(ans,get_max(k<<1,l,mid,lhs,rhs));
if(mid<rhs) ans=max(ans,get_max((k<<1)|1,mid+1,r,lhs,rhs));
return ans;
}
int query_max(int x,int y){
int fx=top[x],fy=top[y],ans=-3e5;
if(dep[fx]<dep[fy]) {swap(x,y); swap(fx,fy);}
while(fx!=fy){
ans=max(ans,get_max(1,1,n,cid[fx],cid[x]));
x=par[fx]; fx=top[x];
}
if(dep[x]<dep[y]) swap(x,y);
ans=max(ans,get_max(1,1,n,cid[y],cid[x]));
return ans;
}
int get_sum(int k,int l,int r,int lhs,int rhs){
if(l>=lhs&&r<=rhs) return sum[k];
int mid=(l+r)>>1,ans=0;
if(mid>=lhs) ans=ans+get_sum(k<<1,l,mid,lhs,rhs);
if(mid<rhs) ans=ans+get_sum((k<<1)|1,mid+1,r,lhs,rhs);
return ans;
}
int query_sum(int x,int y){
int fx=top[x],fy=top[y],ans=0;
if(dep[fx]<dep[fy]) {swap(x,y); swap(fx,fy);}
while(fx!=fy){
ans=ans+get_sum(1,1,n,cid[fx],cid[x]);
x=par[fx]; fx=top[x];
}
if(dep[x]<dep[y]) swap(x,y);
ans=ans+get_sum(1,1,n,cid[y],cid[x]);
return ans;
}
int main(){
read(n);
for(int i=1;i<n;i++) {read(l); read(r); add(l,r); add(r,l);}
for(int i=1;i<=n;i++) read(val[i]);
dep[1]=top[1]=cid[1]=ccid[1]=cnt=1;
dfs1(1); dfs2(1); build(1,1,n);
read(q);
for(int qq=1;qq<=q;qq++){
cin>>s; read(u); read(v);
if(s[1]=='H') change(1,1,n,cid[u],v);//切记转变为 cid
else if(s[1]=='M') printf("%d\n",query_max(u,v));
else printf("%d\n",query_sum(u,v));
}
return 0;
}