fzu 2082 过路费
和poj2763一样
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <cstdio> #include <cstring> #define Lson l,mid,rt<<1 #define Rson mid+1,r,rt<<1|1 using namespace std; const int M = 5e4+7; typedef long long ll; int n,q,pp; int cnt,tot,head[M],p[M]; int sz[M],son[M],f[M],dep[M],rnk[M],id[M],top[M]; ll a[M],sum[M<<2]; struct edge{ int v,next; ll w; }e[M<<1]; void init(){ tot=cnt=0;memset(head,-1,sizeof(head)); } void add(int u,int v,ll w){ e[++cnt].v=v;e[cnt].w=w;e[cnt].next=head[u]; head[u]=cnt; } void fsd(int u,int fa){ for(int i=head[u];~i;i=e[i].next){ int v=e[i].v;ll w=e[i].w; if(v==fa) continue; a[v]=w;p[(i-1)/2+1]=v; fsd(v,u); } return ; } void dfs(int u,int fa,int d){ sz[u]=1;f[u]=fa;dep[u]=d;son[u]=-1; for(int i=head[u];~i;i=e[i].next){ int v=e[i].v; if(v==fa) continue; dfs(v,u,d+1); sz[u]+=sz[v]; if(son[u]==-1||sz[v]>sz[son[u]]) son[u]=v; } return ; } void dfs1(int u,int t){ id[u]=++tot; rnk[tot]=u; top[u]=t; if(son[u]==-1) return ; dfs1(son[u],t); for(int i=head[u];~i;i=e[i].next){ int v=e[i].v; if(v==f[u]||v==son[u]) continue; dfs1(v,v); } return ; } void Pushup(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void build(int l,int r,int rt){ sum[rt]=0; if(l==r){ sum[rt]=a[rnk[l]]; return ; } int mid=(l+r)>>1; build(Lson); build(Rson); Pushup(rt); } void update(int l,int r,int rt,ll v){ if(l==r){ sum[rt]=v; return ; } int mid=(l+r)>>1; if(pp<=mid) update(Lson,v); else update(Rson,v); Pushup(rt); } ll query(int L,int R,int l,int r,int rt){ if(L<=l&&r<=R){ return sum[rt]; } int mid=(l+r)>>1;ll res=0; if(L<=mid) res+=query(L,R,Lson); if(R>mid) res+=query(L,R,Rson); return res; } ll Sum(int x,int y){ int fx=top[x],fy=top[y];ll res=0; while(fx!=fy){ if(dep[fx]>dep[fy]){ res+=query(id[fx],id[x],1,n,1); x=f[fx],fx=top[x]; } else{ res+=query(id[fy],id[y],1,n,1); y=f[fy],fy=top[y]; } } if(x==y) return res; if(dep[x]<dep[y]) res+=query(id[son[x]],id[y],1,n,1); else res+=query(id[son[y]],id[x],1,n,1); return res; } int main(){ while(~scanf("%d%d",&n,&q)){ init(); for(int i=1;i<n;i++){ int u,v;ll w; scanf("%d%d%lld",&u,&v,&w); add(u,v,w);add(v,u,w); } fsd(1,-1); dfs(1,-1,1); dfs1(1,1); build(1,n,1); while(q--){ int op,a; scanf("%d",&op); if(op==0){ ll b; scanf("%d%lld",&a,&b);pp=id[p[a]]; update(1,n,1,b); } else{ int b; scanf("%d%d",&a,&b); printf("%lld\n",Sum(a,b)); } } } return 0; }