90分求卡常
查看原帖
90分求卡常
716965
L_zaa_L楼主2023/11/12 21:59
#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int p=0, q=1;
	char ch=getchar();
	while (!isdigit(ch)) q=(ch=='-')?-1:1,ch=getchar();
	while (isdigit(ch)) p=(p<<3)+(p<<1)+(ch^48),ch=getchar();
	return p*q;
}
//--------------------------------------------------------------------
int n,Qu,a[1000005];
int dep[1000005],top[1000005],fa[1000005],sz[1000005];
int son[1000005],dfn[1000005],idx=0,tail[1000005];
vector<int>q[1000005];
inline int max(int a,int b){
	return (a>b)?a:b;
}
struct Matrix{
	int a[2][2];
	inline Matrix(){a[0][0]=a[1][0]=a[0][1]=a[1][1]=0;}
	inline Matrix operator*(const Matrix&b)const{
		Matrix c;
		c.a[0][0]=max(a[0][0]+b.a[0][0],a[0][1]+b.a[1][0]);
		c.a[1][0]=max(a[1][0]+b.a[0][0],a[1][1]+b.a[1][0]);
		c.a[0][1]=max(a[0][0]+b.a[0][1],a[0][1]+b.a[1][1]);
		c.a[1][1]=max(a[1][0]+b.a[0][1],a[1][1]+b.a[1][1]);
		return c;
	}
}tree[3750005],s[1000005];
inline void dfs1(int now){
	sz[now]=1;son[now]=0;
	for(auto v:q[now])
		if(!dep[v]){
			dep[v]=dep[now]+1;
			fa[v]=now;
			dfs1(v);
			sz[now]+=sz[v];
			if(!son[now]||sz[son[now]]<sz[v])son[now]=v;
		}
}
inline void dfs2(int now){
	dfn[now]=++idx;
	if(son[now]){
		top[son[now]]=top[now];
		dfs2(son[now]);
	}
	for(auto v:q[now])
		if(v!=son[now]&&dep[v]>dep[now]){
			top[v]=v;
			dfs2(v);
		}
	tail[now]=(son[now])?tail[son[now]]:now;
}
Matrix query(int l,int r,int p,const int&L,const int&R){
	if(L<=l&&r<=R)return tree[p];
	int mid=(l+r)>>1;
	if(L<=mid&&mid<R)
		return query(mid+1,r,p<<1|1,L,R)*query(l,mid,p<<1,L,R);
	else if(mid<R)
		return query(mid+1,r,p<<1|1,L,R);
	else if(L<=mid)
		return query(l,mid,p<<1,L,R);
	else return s[0];
}
inline void modify(int l,int r,int p,const int&pos,const Matrix&to){
	if(l==r){
		tree[p]=to;
		return;
	}
	int mid=(l+r)>>1;
	if(pos<=mid)
		modify(l,mid,p<<1,pos,to);
	else
		modify(mid+1,r,p<<1|1,pos,to);
	tree[p]=tree[p<<1|1]*tree[p<<1];
}
inline void calc(int now){
	stack<int>Q;
	for(int i=now;i;i=son[i])
		Q.push(i);
	while(!Q.empty()){
		int u=Q.top();
		Q.pop();
		int x=0,y=a[u];
		for(auto v:q[u])
			if(dep[v]>dep[u]&&v!=son[u]){
				calc(v);
				Matrix gg=s[v];
				x+=max(gg.a[0][0],gg.a[0][1]);
				y+=gg.a[0][0];
			}
		Matrix gg;
		gg.a[0][0]=gg.a[1][0]=x;
		gg.a[0][1]=y;
		modify(1,n,1,dfn[u],gg);
	}
	s[now]=query(1,n,1,dfn[now],dfn[tail[now]]);
}
inline void modify(int u,int val){
	Matrix p=query(1,n,1,dfn[u],dfn[u]);
	p.a[0][1]+=val-a[u];
	modify(1,n,1,dfn[u],p);
	a[u]=val;
	for(int now=top[u];now!=1;now=top[now]){
		int f=fa[now];
		p=query(1,n,1,dfn[f],dfn[f]);
		Matrix q=query(1,n,1,dfn[now],dfn[tail[now]]);
		p.a[0][0]+=max(q.a[0][0],q.a[0][1])-max(s[now].a[0][0],s[now].a[0][1]);
		p.a[0][1]+=q.a[0][0]-s[now].a[0][0];
		p.a[1][0]=p.a[0][0];
		modify(1,n,1,dfn[f],p);
		s[now]=q;now=f;
	}
}
int lastans;
signed main(){
	n=read();
	Qu=read();
	for(int i=1;i<=n;++i)
		a[i]=read();
	for(int i=1,u,v;i<n;++i){
		u=read(),v=read();
		q[u].push_back(v);
		q[v].push_back(u);
	}
	dep[1]=1;top[1]=1;
	dfs1(1);dfs2(1);calc(1);
	while(Qu--){
		int x=read()^lastans,y=read();
		modify(x,y);
		Matrix p=query(1,n,1,1,dfn[tail[1]]);
		printf("%d",max(p.a[0][0],p.a[0][1]));
		puts("");
		lastans=max(p.a[0][0],p.a[0][1]);
	}
	return 0;
}
2023/11/12 21:59
加载中...