五个RE,两个MLE。。。 貌似我的线段树空间比较大。。。 但是感觉没啥可以去掉的数组。。。。
#include<bits/stdc++.h>
//#define zhale exit(0)
//#define Freopen
//#define Clock
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double qwq;
typedef pair<ll,ll> llP;
template<class T>
void Swap(T &x,T &y)
{
T z=x;
x=y;
y=z;
}
template<class T>
T Read()
{
T 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^'0');
ch=getchar();
}
return x*f;
}
int (*read)()=Read<int>;
ll (*readll)()=Read<ll>;
const int N=3e4+5;
int n,q;
int ver[N],head[N],nxt[N],w[N],tot;
int a[N];
class SMT{
struct Node{
int l,r,mx,sum;
}T[N<<2];
public:
void build(int p,int l,int r){
T[p].l=l,T[p].r=r;
if(T[p].l==T[p].r)
{
T[p].mx=T[p].sum=w[a[l]];
return ;
}
int mid=l+(r-l>>1);
build(p*2,l,mid);
build(p*2+1,mid+1,r);
T[p].sum=T[p*2].sum+T[p*2+1].sum;
T[p].mx=max(T[p*2].mx,T[p*2+1].mx);
}
void change(int p,int x,int k){
if(T[p].l==T[p].r)
{
T[p].sum=T[p].mx=k;
return ;
}
int mid=T[p].l+(T[p].r-T[p].l>>1);
if(x<=mid)
change(p*2,x,k);
else
change(p*2+1,x,k);
T[p].sum=T[p*2].sum+T[p*2+1].sum;
T[p].mx=max(T[p*2].mx,T[p*2+1].mx);
}
int getmax(int p,int l,int r){
if(T[p].l>=l&&T[p].r<=r)
return T[p].mx;
int mid=T[p].l+(T[p].r-T[p].l>>1),val=-(1<<30);
if(l<=mid)
val=max(val,getmax(p*2,l,r));
if(r>mid)
val=max(val,getmax(p*2+1,l,r));
return val;
}
int getsum(int p,int l,int r)
{
if(T[p].l>=l&&T[p].r<=r)
return T[p].sum;
int mid=T[p].l+(T[p].r-T[p].l>>1),val=0;
if(l<=mid)
val+=getsum(p*2,l,r);
if(r>mid)
val+=getsum(p*2+1,l,r);
return val;
}
}t;
void add(int x,int y)
{
ver[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
int d[N],hyson[N],fa[N],sz[N],id[N],top[N],cnt;
void dfs1(int x,int f)
{
sz[x]=1;
int szmx=-1;
for(int i=head[x];i;i=nxt[i])
{
int y=ver[i];
if(d[y]||y==f)
continue;
d[y]=d[x]+1;
fa[y]=x;
dfs1(y,x);
sz[x]+=sz[y];
if(sz[y]>szmx)
hyson[x]=y,szmx=sz[y];
}
}
void dfs2(int x,int xtop)
{
id[x]=++cnt;
a[cnt]=x;
top[x]=xtop;
if(hyson[x])
dfs2(hyson[x],xtop);
for(int i=head[x];i;i=nxt[i])
{
int y=ver[i];
if(y!=fa[x]&&y!=hyson[x])
dfs2(y,y);
}
}
int qmax(int x,int y)
{
int val=-(1<<30);
while(top[x]!=top[y])
{
if(d[top[x]]<d[top[y]])
Swap(x,y);
val=max(val,t.getmax(1,id[top[x]],id[x]));
x=fa[top[x]];
}
if(d[x]>d[y])
Swap(x,y);
return val=max(val,t.getmax(1,id[x],id[y]));
}
int qsum(int x,int y)
{
int val=0;
while(top[x]!=top[y])
{
if(d[top[x]]<d[top[y]])
Swap(x,y);
val+=t.getsum(1,id[top[x]],id[x]);
x=fa[top[x]];
}
if(d[x]>d[y])
Swap(x,y);
return val+=t.getsum(1,id[x],id[y]);
}
inline int True()
{
#ifdef Freopen
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#endif
#ifdef Clock
int STR=clock();
#endif
n=read();
for(int i=1;i<n;++i)
{
int x=read(),y=read();
add(x,y);
add(y,x);
}
for(int i=1;i<=n;++i)
w[i]=read();
dfs1(1,0);
dfs2(1,1);
t.build(1,1,n);
q=read();
for(int i=1;i<=q;++i)
{
char ch[10];
cin>>ch;
if(ch[1]=='H')
{
int x=read(),k=read();
t.change(1,id[x],k);
}
else if(ch[1]=='M')
{
int x=read(),y=read();
printf("%d\n",qmax(x,y));
}
else
{
int x=read(),y=read();
printf("%d\n",qsum(x,y));
}
}
#ifdef Clock
int END=clock();
printf("Time: %dms\n",int((END-STR)/(qwq)CLOCKS_PER_SEC*1000));
printf("Time: %ds\n",int((END-STR)/(qwq)CLOCKS_PER_SEC));
#endif
return (0-0);//q(0-0)p q(>-<)p
}
int Love=True();
int main(){;}