树链剖分模板

来源:互联网 发布:淘宝买家服务热线 编辑:程序博客网 时间:2024/05/17 08:06
void dfs(ll x){      deep[x]=deep[dad[x]]+1;      size[x]=1;    for(ll i=0;i<vec[x].size();i++)      if(dad[x]!=vec[x][i]){          dad[vec[x][i]]=x;          dfs(vec[x][i]);          size[x]+=size[vec[x][i]];      }     }  void dfs1(ll x){      if(!top[x])top[x]=x;      dfn[x]=++cnt;pos[cnt]=x;      ll t=0;      for(ll i=0;i<vec[x].size();i++)          if(dad[x]!=vec[x][i]&&size[vec[x][i]]>size[t])t=vec[x][i];      if(t)top[t]=top[x],dfs1(t);     for(ll i=0;i<vec[x].size();i++)          if(dad[x]!=vec[x][i]&&vec[x][i]!=t)dfs1(vec[x][i]);  }  void query(ll x,ll y){      ll ans=0;for(;top[x]!=top[y];x=dad[top[x]]){          if(deep[top[x]]<deep[top[y]])swap(x,y);          ans+=ask(dfn[top[x]],dfn[x],1,n,1);      }      if(deep[x]>deep[y])swap(x,y);      ans+=ask(dfn[x],dfn[y],1,n,1);  printf("%lld\n",ans);}