修改时这样是龊的。
while(m--){
int u,x,v,y;
cin>>u>>x>>v>>y;
mat gu=g[u],gv=g[v];
g[u].a[1][0]+=(x?-INF:INF)-a[u];
g[v].a[1][0]+=(y?-INF:INF)-a[v];
update(u),update(v);
mat gty=seg.query(1,1,n,dfn[top[1]],pot[top[1]]);
int ans=max(gty.a[0][0],gty.a[1][0])+(!x)*(-INF+a[u])+(!y)*(-INF+a[v]);
if(ans<0)cout<<-1<<'\n';
else cout<<sum-ans<<'\n';
g[u]=gu,g[v]=gv;
update(u),update(v);
}
应该先改一个,记录另一个的状态,再改另一个。改回去是反过来就行了。
while(m--){
int u,x,v,y;
cin>>u>>x>>v>>y;
mat gu=g[u];g[u].a[1][0]+=(x?-INF:INF)-a[u];update(u);
mat gv=g[v];g[v].a[1][0]+=(y?-INF:INF)-a[v];update(v);
mat gty=seg.query(1,1,n,dfn[1],pot[1]);
int ans=max(gty.a[0][0],gty.a[1][0]);
cout<<ans<<' ';
ans+=(!x)*(a[u]-INF)+(!y)*(a[v]-INF);
if(ans<0)cout<<-1<<'\n';
else cout<<sum-ans<<'\n';
g[v]=gv,update(v),g[u]=gu,update(u);
}