似乎只能过 m=1 的情况()
#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
int T;
int n,m;
int a[100005],b[100005];
struct EDGE{
int u,v,nxt;
}edge[200005];
int head[100005],tot;
void add(int u,int v){
edge[++tot]={u,v,head[u]};
head[u]=tot;
}
struct query{
int opt,u,v;
}q[100005];
bool cmp(query x,query y){
return x.opt>y.opt;
}
int fa[100005];
int Find(int x){
if(x==fa[x])return x;
return fa[x]=Find(fa[x]);
}
void Union(int x,int y){
if(Find(x)==Find(y))return ;
fa[Find(x)]=Find(y);
}
int color[100005];
int vis[100005];
bool is,f;
int suml,sumr;
void dfs(int x,int fa,int col){
if(col==1)suml+=a[x]-b[x];
else sumr+=a[x]-b[x];
color[x]=col;
vis[x]=1;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].v;
if(!vis[Find(v)]){
if(col==1)dfs(Find(v),x,2);
else dfs(Find(v),x,1);
}
else if(color[Find(v)]==col)is=0;
}
}
signed main(){
cin>>T;
while(T--){
f=1;
memset(head,0,sizeof(head));
memset(edge,0,sizeof(edge));
memset(color,0,sizeof(color));
memset(vis,0,sizeof(vis));
tot=0;
cin>>n>>m;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
for(int i=1;i<=m;i++)cin>>q[i].opt>>q[i].u>>q[i].v;
sort(q+1,q+m+1,cmp);
for(int i=1;i<=m;i++){
if(q[i].opt==2){
int u=q[i].u,v=q[i].v;
Union(u,v);
a[v]+=a[u];
b[v]+=b[u];
}
else{
add(Find(q[i].u),Find(q[i].v));
add(Find(q[i].v),Find(q[i].u));
}
}
for(int i=1;i<=n;i++){
if(!vis[Find(i)]){
is=1;suml=0;sumr=0;
dfs(Find(i),0,1);
if(is&&suml!=sumr)f=0;
if(!is&&((suml^sumr)&1))f=0;
}
}
if(f)cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}
/*
1
2 1
2 3
3 3
1 1 2
*/