萌新求助点分树 50pts MLE
查看原帖
萌新求助点分树 50pts MLE
352426
就决定是你辣楼主2023/5/18 13:39
#include<bits/stdc++.h>
#define lowbit(x) (x&-x)
#define int long long
#define rep for(int i=head[u],v;i,v=to[i];i=nxt[i])
using namespace std;

const int maxn=6e5+10;
int head[maxn],nxt[maxn],to[maxn],w[maxn],tot;
int dep[maxn],hson[maxn],siz[maxn],top[maxn],fa[maxn];
int hsiz[maxn],sum,f[maxn],a[maxn],rt,vis[maxn]; 
int fr[maxn];
vector<int>c[2][maxn];
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void add(int u,int v){
	nxt[++tot]=head[u],to[head[u]=tot]=v;
}
void dfs1(int u,int lst,int op){
	
	if(op)dep[u]=dep[lst]+1,fa[u]=lst,dep[1]=0;
	siz[u]=1;
	for(int i=head[u];i;i=nxt[i]){
		int v=to[i];
		if(v==lst||vis[v])continue; 
		dfs1(v,u,op);
		siz[u]+=siz[v];
		if(op)if(siz[v]>siz[hson[u]]) hson[u]=v;
		hsiz[u]=max(hsiz[u],siz[v]);
	}
	hsiz[u]=max(hsiz[u],sum-hsiz[u]);
	if(hsiz[u]<hsiz[rt]) rt=u;
}
void dfs2(int u,int topf){
	top[u]=topf;
	if(!hson[u]) return ;
	dfs2(hson[u],topf);
	for(int i=head[u];i;i=nxt[i]){
		int v=to[i];
		if(v==hson[u]||v==fa[u])continue;
		dfs2(v,v);
	}
}
int dis(int u,int v){
	int uu=u,vv=v;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		u=fa[top[u]];
	}
	int lca=dep[u]<dep[v]?u:v;
	
	return dep[uu]+dep[vv]-2*dep[lca];
} 
void divide(int u){
	//cout<<u<<endl;
	vis[u]=1;
	siz[u]=sum+1;
	c[0][u].resize(siz[u]+1);
	c[1][u].resize(siz[u]+1);
	rep if(!vis[v]){
		sum=siz[v];
		rt=0;
		dfs1(v,-1,0);
		dfs1(rt,-1,0);
		fr[rt]=u;
		divide(rt);
	}
}
void upd(int u,int op,int x,int w){
	x++;
	while(x<=siz[u]){
		c[op][u][x]+=w;
		x+=lowbit(x);
	}
}
int get(int u,int op,int x){
	x++;
	int res=0;
	x=min(x,siz[u]);
	while(x){
		res+=c[op][u][x];
		x-=lowbit(x);
	}
	return res;
}
void modify(int u,int w){
	//cout<<w<<endl;
	for(int i=u;i;i=fr[i]) upd(i,0,dis(u,i),w);//,cout<<dis(u,i)<<" "<<u<<" "<<i<<endl;
	for(int i=u;fr[i];i=fr[i]) upd(i,1,dis(u,fr[i]),w);//cout<<dis(u,fr[i])<<" "<<u<<" "<<i<<endl;
}
signed main(){
	int n=read(),m=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		add(u,v);add(v,u);
	}
	rt=0;
	hsiz[rt]=0x3f3f3f3f;
	sum=n;
	
	dfs1(1,-1,1);
	dfs2(1,1);
	dfs1(rt,-1,0);
	divide(rt);
	int ans=0;
	for(int i=1;i<=n;i++) modify(i,a[i]);
	for(int i=1;i<=m;i++){
		int op=read(),x=read()^ans,y=read()^ans;
		if(!op){
			ans=0;
			ans+=get(x,0,y);
			
			for(int i=x;fr[i];i=fr[i]){
				int d=dis(x,fr[i]);
				//cout<<get(fr[i],0,y-d)<<endl;
				if(y>=d) ans+=get(fr[i],0,y-d)-get(i,1,y-d);
			}
			cout<<ans<<endl;
		}
		else modify(x,y-a[x]),a[x]=y;
	}
}
2023/5/18 13:39
加载中...