自认为可读性很强的码风QAQ
可以帮我调一下吗qwq,不知道为什么RE了
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e4+10;
struct node{int s[11],g[11],l,r;}t[N<<2];
int n,m,key[N],top[N],ct[N],fa[N],dep[N],hs[N],dfn[N],nfd[N];
vector<pair<int,int>>e[N];
void dfs1(int u)
{
int v;
ct[u]=1;dep[u]=dep[fa[u]]+1;
for(auto x:e[u])if((v=x.first)!=fa[u])
{
fa[v]=u;key[v]=x.second;
dfs1(v);ct[u]+=ct[v];
hs[u]=ct[v]>ct[hs[u]]?v:hs[u];
}
return;
}
void dfs2(int u,int T)
{
top[u]=T;dfn[u]=++dfn[0];nfd[dfn[0]]=u;
if(hs[u])dfs2(hs[u],T);
for(auto x:e[u])if(x.first!=hs[u]&&x.first!=fa[u])dfs2(x.first,x.first);
return;
}
void dfs(int u,int now)
{
key[u]=(now^=key[u]);
for(auto x:e[u])if(x.first!=fa[u])dfs(x.first,now);
return;
}
void split(int u,int val)
{
int k=0;
do{t[u].s[k++]=(val&1);val>>=1;
}while(val);
return;
}
void pushup(int u)
{
for(int i=0;i<=10;i++)t[u].s[i]=t[u<<1].s[i]+t[u<<1|1].s[i];
return;
}
void Opp(int u,int k)
{
t[u].s[k]=t[u].r-t[u].l+1-t[u].s[k];
t[u].g[k]++;
return;
}
void pushdown(int u)
{
for(int i=0;i<=10;i++){
if(t[u<<1].g[i]<t[u].g[i]&&(t[u<<1].g[i]&1)!=(t[u].g[i]&1))Opp(u<<1,i);
if(t[u<<1|1].g[i]<t[u].g[i]&&(t[u<<1|1].g[i]&1)!=(t[u].g[i]&1))Opp(u<<1|1,i);}
return;
}
void Build(int u,int L,int R)
{
t[u].l=L;t[u].r=R;
if(L==R){split(u,key[nfd[L]]);return;}
int mid=L+R>>1;
Build(u<<1,L,mid);Build(u<<1|1,mid+1,R);
pushup(u);
return;
}
int qry1(int u,int k,int L,int R)
{
if(t[u].r<L||t[u].l>R)return 0;
if(t[u].l>=L&&t[u].r<=R)return t[u].s[k];
pushdown(u);
int mid=t[u].l+t[u].r>>1,ret=0;
if(mid>=L)ret+=qry1(u<<1,k,L,R);if(mid+1<=R)ret+=qry1(u<<1|1,k,L,R);
pushup(u);
return ret;
}
int qry2(int u,int aim)
{
if(t[u].l==aim&&t[u].r==aim)return u;
pushdown(u);
int mid=t[u].l+t[u].r>>1,ret=0;
if(mid>=aim)ret=qry2(u<<1,aim);else ret=qry2(u<<1|1,aim);
pushup(u);
return ret;
}
void mdf(int u,int k,int L,int R)
{
if(t[u].l>R||t[u].r<L)return;
if(t[u].l>=L&&t[u].r<=R){Opp(u,k);return;}
pushdown(u);
int mid=t[u].l+t[u].r>>1;
if(mid>=L)mdf(u<<1,k,L,R);if(mid+1<=R)mdf(u<<1|1,k,L,R);
pushup(u);
return;
}
void update(int u,int aim)
{
if(t[u].l==aim&&t[u].r==aim)return;
int mid=t[u].l+t[u].r>>1;
if(mid>=aim)update(u<<1,aim);else update(u<<1|1,aim);
pushup(u);
return;
}
int lca(int x,int y)
{
if(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);
x=fa[top[x]];
}
if(dep[x]<dep[y])return x;
else return y;
}
int query(int x,int y)
{
int o[11]={},ret=0,dis=dep[x]+dep[y]-(dep[lca(x,y)]<<1)+1;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);
for(int i=0;i<=10;i++)o[i]+=qry1(1,i,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if(dep[x]<dep[y])swap(x,y);
for(int i=0;i<=10;i++)o[i]+=qry1(1,i,dfn[y],dfn[x]);
for(int i=0;i<=10;i++)ret+=1ll*(1<<i)*o[i]*(dis-o[i]);
return ret;
}
void modify(int u,int val)
{
int old=qry2(1,u);
memset(t[0].s,0,sizeof(t[0].s));split(0,val);
for(int i=0;i<=10;i++)if(t[0].s[i]!=t[old].s[i])mdf(1,i,dfn[u],dfn[u]+ct[u]-1);
memset(t[old].s,0,sizeof(t[old].s));
split(old,val);update(1,old);
return;
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<n;i++)
{
int x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
e[x].push_back(make_pair(y,z));e[y].push_back(make_pair(x,z));
}
dfs1(1);dfs2(1,1);dfs(1,0);Build(1,1,n);
for(int i=1;i<=m;i++)
{
int opt,x,y,z;
scanf("%lld%lld%lld",&opt,&x,&y);
if(opt==1)printf("%lld\n",query(x,y));
else if(opt==2)scanf("%lld",&z),modify(max(dfn[x],dfn[y]),z);
}
system("pause");
return 0;
}