全WA了(板子保熟())
查看原帖
全WA了(板子保熟())
560828
Nemophilist0413楼主2023/2/19 20:08
#include<bits/stdc++.h>
#define R register
using namespace std;
typedef long long ll;
inline ll read(){
	ll s=0,f=0,c=getchar();
	for(;!isdigit(c);c=getchar())f|=c==45;
	for(;isdigit(c);c=getchar())s=(s<<3)+(s<<1)+(c^48);
	return f?-s:s;
}
inline void put1(ll x){
	if(x<0)putchar(45),x=-x;
	if(x>9)put1(x/10);
	putchar(x%10+48);
}
inline void put(ll x,char c=' '){
	put1(x);
	putchar(c);
}
inline ll qpow(ll a,ll b,ll mod){
	ll res=1;
	while(b){
		if(b&1)res=res*a%mod;
		a=a*a%mod;b>>=1;
	}
	return res;
}
inline void swp(ll&a,ll&b){
	a^=b^=a^=b;
}
const ll N=120000;
ll t[N<<2],lz[N<<2],cnt,H[N];
ll top[N],dep[N],son[N],sz[N],val[N],fa[N];
ll dfn[N<<2],dfp[N<<2];
struct E{
	ll nx,to;
}e[N<<1];
struct P{
	ll x,y,w;
}po[N<<1];
inline void add(ll x,ll y){
	e[++cnt].to=y;e[cnt].nx=H[x];H[x]=cnt;
}
void dfs1(ll x,ll f){
	sz[x]=1;fa[x]=f;dep[x]=dep[f]+1;
	for(ll i=H[x];i;i=e[i].nx){
		ll y=e[i].to;
		if(y-f){
			dfs1(y,x);sz[x]+=sz[y];
			if(sz[y]>sz[son[x]])son[x]=y;
		}
	}
}
void dfs2(ll x,ll f){
	dfn[x]=++dfn[0];
	dfp[dfn[0]]=x;
	if(son[x]){
		top[son[x]]=top[x];
		dfs2(son[x],x);
	}
	for(ll i=H[x];i;i=e[i].nx){
		ll y=e[i].to;
		if(y!=fa[x]&&y!=son[x]){
			top[y]=y;
			dfs2(y,x);
		}
	}
}
void pushup(ll rt){
    t[rt]=t[rt<<1]+t[rt<<1|1];
}
void pushdown(ll rt,ll x){
    if(!lz[rt])return;
    t[rt<<1]+=lz[rt]*(x-(x>>1));
    lz[rt<<1]+=lz[rt];
    t[rt<<1|1]+=lz[rt]*(x>>1);
    lz[rt<<1|1]+=lz[rt];
    lz[rt]=0;
}
void build(ll rt,ll l,ll r){
    lz[rt]=0;
    if(l==r){
        t[rt]=val[l];
        return;
    }
    ll mid=l+r>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
    pushup(rt);
}
void modify(ll rt,ll l,ll r,ll x,ll y,ll v){
    if(x<=l&&y>=r){
        lz[rt]+=v;
        t[rt]+=v*(r-l+1);
        return;
    }
    pushdown(rt,r-l+1);
    ll mid=l+r>>1;
    if(mid>=x)modify(rt<<1,l,mid,x,y,v);
    if(mid<y)modify(rt<<1|1,mid+1,r,x,y,v);
    pushup(rt);
}
ll query(ll rt,ll l,ll r,ll x,ll y){
    ll ans=0,mid=l+r>>1;
    if(x<=l&&y>=r)return t[rt];
    pushdown(rt,r-l+1);
    if(mid>=x)ans=query(rt<<1,l,mid,x,y);
    if(mid<y)ans+=query(rt<<1|1,mid+1,r,x,y);
    return ans;
}
inline void update(ll x,ll y,ll v){
	ll tx=top[x],ty=top[y];
	while(tx-ty){
		if(dep[tx]<dep[ty])swp(x,y),swp(tx,ty);
		modify(1,1,dfn[0],dfn[tx],dfn[x],v);
		x=fa[tx];tx=top[x];
	}
	if(dep[x]>dep[y])swp(x,y);
	modify(1,1,dfn[0],dfn[x],dfn[y],v);
}
inline ll Query(ll x,ll y){
	ll tx=top[x],ty=top[y],res=0;
	while(tx-ty){
		if(dep[tx]<dep[ty])swp(x,y),swp(tx,ty);
		res+=query(1,1,dfn[0],dfn[tx],dfn[x]);
		x=fa[tx];tx=top[x];
	}
	if(dep[x]>dep[y])swp(x,y);
	if(x==y)return res;
	res+=query(1,1,dfn[0],dfn[x],dfn[y]);
	return res;
}
int main(){
	ll n=read(),m=read();
	for(ll i=1;i<=n;i++)val[i]=read();
	for(ll i=1,x,y;i<n;i++)
	x=read(),y=read(),add(x,y),add(y,x);
	dfs1(1,0);dfn[0]=0;top[1]=1;top[0]=1;
	dfs2(1,0);build(1,1,dfn[0]);
	while(m--){
		ll op=read();
		if(op==1){
			ll x=read(),a=read();
			update(x,x,a);
		}
		if(op==2){
			ll x=read(),a=read();
			modify(1,1,dfn[0],dfn[x],dfn[x]+sz[x]-1,a);
		}
		if(op==3){
			ll x=read();
			put(Query(1,x),10);
		}
	}
}
2023/2/19 20:08
加载中...