30分求调!!
查看原帖
30分求调!!
820453
1145141919810awa楼主2024/8/13 11:04
#include<bits/stdc++.h>
#define int long long

namespace Fast{
	template <typename T>
	inline T read(){
		char c=getchar();
		T x=0;
		int w=1;
		while(c<'0'||c>'9'){
			if(c=='-') w=-1;
			c=getchar();
		}
		while(c>='0'&&c<='9'){
			x=x*10+(c-'0');
			c=getchar();
		}
		return x*w;
	}
	inline void write(int x,char c){
		static int sta[35];
		int tot=0;
		if(x<0) putchar('-'),x=-x;
		do{
			sta[tot++]=x%10,x/=10;
		}while(x);
		while(tot) putchar(sta[--tot]+'0');
		putchar(c);
	}
}
using Fast::read;
using Fast::write;

const int MAXN=1e6;
int fa[MAXN],top[MAXN],son[MAXN],siz[MAXN],dep[MAXN],id[MAXN],ID[MAXN],cnt;
int n,m,a[MAXN];
std::vector<int> v[MAXN];
struct node{
	int l,r,max,sum;
}tr[4*MAXN];

inline void dfs_1(int x,int f){
	fa[x]=f,siz[x]=1,dep[x]=dep[f]+1;
	for(auto it:v[x]){
		if(it!=f){
			dfs_1(it,x);
			siz[x]+=siz[it];
			if(siz[son[x]]<siz[it]) son[x]=it;
		}
	}
}

inline void dfs_2(int x,int t){
	top[x]=t,id[x]=++cnt,ID[cnt]=x;
	if(!son[x]) return ;
	dfs_2(son[x],t);
	for(auto it:v[x]){
		if(it!=son[x]&&it!=fa[x])dfs_2(it,it);
	}
}

#define lc rt<<1
#define rc rt<<1|1

inline void push_up(const int&rt){
	tr[rt].sum=tr[lc].sum+tr[rc].sum;
	tr[rt].max=std::max(tr[lc].max,tr[rc].max);
}

inline void Build(int rt,int l,int r){
	tr[rt].l=l,tr[rt].r=r;
	if(l==r){
		tr[rt].sum=tr[rt].max=a[ID[l]];
		return ;
	}
	int mid=l+r>>1;
	Build(lc,l,mid),Build(rc,mid+1,r);
	push_up(rt);
}

inline int sum(int rt,const int &l,const int &r){
	if(l<=tr[rt].l&&r>=tr[rt].r) return tr[rt].sum;
	int mid=tr[rt].l+tr[rt].r>>1,ans=0;
	if(l<=mid) ans+=sum(lc,l,r);
	if(r>mid) ans+=sum(rc,l,r);
	return ans;
}

inline int max(int rt,const int&l,const int&r){
	if(l<=tr[rt].l&&r>=tr[rt].r) return tr[rt].max;
	int mid=tr[rt].l+tr[rt].r>>1,ans=INT_MIN;
	if(l<=mid) ans=std::max(ans,max(lc,l,r));
	if(r>mid) ans=std::max(ans,max(rc,l,r));
	return ans;
}

inline void update(int rt,const int&i,const int&x){
	if(tr[rt].l==tr[rt].r&&i==tr[rt].l){
		tr[rt].sum=tr[rt].max=x;
		return ;
	}
	int mid=tr[rt].l+tr[rt].r>>1;
	if(i<=mid) update(lc,i,x);
	else update(rc,i,x);
	push_up(rt);
}

inline int query_sum(int u,int v){
	int ans=0;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]]) std::swap(u,v);
		ans=ans+sum(1,id[top[u]],id[u]);
		u=fa[top[u]];
	}
	if(dep[u]<dep[v]) std::swap(u,v);
	ans=ans+sum(1,id[v],id[u]);
	return ans;
}

inline int query_max(int u,int v){
	int ans=INT_MIN;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]]) std::swap(u,v);
		ans=std::max(ans,max(1,id[top[u]],id[u]));
		u=fa[top[u]];
	}
	if(dep[u]<dep[v]) std::swap(u,v);
	ans=std::max(ans,max(1,id[v],id[u]));
	return ans;
}

signed main(){
//	freopen("1.txt","r",stdin);
//	freopen("out.txt","w",stdout);
	n=read<int>();
	for(int i=1;i<n;i++){
		int x,y;
		x=read<int>(),y=read<int>();
		v[x].push_back(y);
		v[y].push_back(x);
	}
	for(int i=1;i<=n;i++) a[i]=read<int>();
	dfs_1(1,0),dfs_2(1,1),Build(1,1,n);

	m=read<int>();
	while(m--){
		std::string op;
		int x,y;
		std::cin>>op;
		x=read<int>(),y=read<int>();
		if(op=="CHANGE") update(1,x,y);
		if(op=="QMAX") write(query_max(x,y),'\n');
		if(op=="QSUM") write(query_sum(x,y),'\n');
	}
	return 0;
}
2024/8/13 11:04
加载中...