莫名其妙挂在了#11和#12
#include<bits/stdc++.h>
using namespace std;
const int maxN=100010;
int a[maxN],b[maxN],f[maxN],g[maxN],fa[maxN];
bool book[maxN];
vector<int> v[maxN];
int Find(int x){
if(fa[x]==x) return x;
else return fa[x]=Find(fa[x]);
}
void merge(int x,int y){
x=Find(x),y=Find(y);
if(x!=y){
fa[x]=y;
a[y]+=a[x];
b[y]+=b[x];
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(book,0,sizeof(book));
int n,m,cnt=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
for(int i=1;i<=n;i++){
fa[i]=i;
v[i].clear();
}
int opt,x,y;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&opt,&x,&y);
if(opt==1){
cnt++;
f[cnt]=x,g[cnt]=y;
} else {
merge(x,y);
}
}
for(int i=1;i<=cnt;i++){
v[Find(f[i])].push_back(Find(g[i]));
v[Find(g[i])].push_back(Find(f[i]));
}
for(int i=1;i<=n;i++){
for(int j=1;j<v[i].size();j++){
merge(v[i][j],v[i][j-1]);
}
}
bool flag=0;
for(int i=1;i<=n;i++){
int p=Find(i);
if(book[p]) continue;
book[p]=1;
if(!v[p].size()){
if(a[p]!=b[p]) flag=1;
}
for(int j=0;j<v[p].size();j++){
int q=Find(v[p][j]);
if(p==q){
if((a[p]-b[p])&1==0) flag=1;
} else {
if(a[p]-b[p]!=a[q]-b[q]) flag=1;
}
}
}
if(flag==0) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}