#include <bits/stdc++.h>
using namespace std;
 
void __print(int x) {cerr << x;}
void __print(long x) {cerr << x;}
void __print(long long x) {cerr << x;}

void __print(unsigned x) {cerr << x;}
void __print(unsigned long x) {cerr << x;}
void __print(unsigned long long x) {cerr << x;}
void __print(float x) {cerr << x;}
void __print(double x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << '\'' << x << '\'';}
void __print(const char *x) {cerr << '\"' << x << '\"';}
void __print(const string &x) {cerr << '\"' << x << '\"';}
void __print(bool x) {cerr << (x ? "true" : "false");}

template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}

#ifdef ARTHUR_LOCAL
	#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
	#define debug(x...)
#endif

using ll = long long;
 
#define ff first
#define ss second
#define all(x) (x).begin(), (x).end()
#define len(x) int((x).size())

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define randint(n) uniform_int_distribution<int>(1, (n))(rng)

const int p2=(1<<18); // check

int st[p2+p2];
int lazy[p2+p2];

void push(int v, int tl, int tr)
{
	if(lazy[v]!=-1&&v<p2){
		st[2*v]=lazy[v]*int((tr-tl+1)/2);
		st[2*v+1]=st[2*v];
		lazy[2*v]=lazy[v];
		lazy[2*v+1]=lazy[v];
	}
	lazy[v]=-1;
}

void update(int v, int tl, int tr, int l, int r, int val)
{
	// cout<<v<<endl;
	if(l>r||tr<l||tl>r) return;

	if(l<=tl&&r>=tr){
		// cout<<"Assigned "<<tl<<" "<<tr<<" "<<val<<endl;
		st[v]=(tr-tl+1) * val;
		lazy[v]=val;
		return;
	}

	else{
		push(v, tl, tr); // ah do this so we don't push bad updates? shouldn't matter anyway
		int tm=int((tl+tr)/2);
		update(2*v, tl, tm, l, r, val);
		update(2*v+1, tm+1, tr, l, r, val);		
		st[v]=st[2*v]+st[2*v+1];
	}
}

int query(int v, int tl, int tr, int l, int r) // v is associated with tl and tr
{
	// debug(v);
	// debug(tl);
	// debug(tr);
	// debug(l);
	// debug(r);
	// cout<<"V: "<<v<<endl;
	// cout<<"tl: "<<tl<<endl;
	// cout<<"tr: "<<tr<<endl;
	// cout<<"l: "<<l<<endl;
	// cout<<"r: "<<r<<endl;

	if(l>r||tr<l||tl>r) return 0;

	if(l<=tl&&r>=tr){
		// if(st[v]!=0) cout<<st[v]<<endl;
		return st[v];
	}

	push(v, tl, tr);
	int tm=int((tl+tr)/2);
	return query(2*v, tl, tm, l, r) + query(2*v+1, tm+1, tr, l, r);
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	#ifdef ARTHUR_LOCAL
		ifstream cin("input.txt");
	#endif

	for(int i=0; i<p2+p2; i++) lazy[i]=-1;

	int t;
	cin>>t;
	while(t--){
		int n,q;
		cin>>n>>q;

		string s,f;
		cin>>s>>f;
		
		vector<int> ff(n);
		for(int i=0; i<n; i++){
			if(f[i]=='1'){
				// cout<<p2+i<<endl;
				st[p2+i]=1;
			}
		}

		for(int i=p2; i<p2+n; i++){
			int j=int(i/2);
			while(j>0){
				st[j]=st[2*j]+st[2*j+1];
				// if(st[j]>0) cout<<j<<" "<<st[j]<<endl;
				j/=2;
			}
		}

		vector<pair<int,int>> qs;

		while(q--){
			int l, r;
			cin>>l>>r;
			qs.push_back({l,r});
		}
		reverse(all(qs));
		bool w=1;

		for(auto t:qs){
			int l=t.ff;
			int r=t.ss;

			// for(int i=0; i<n; i++){
			// 	if(query(1,0,p2-1,i,i)==1) cout<<"1";
			// 	else cout<<"0";
			// }
			// cout<<endl;

			int cur=query(1,0,p2-1,l-1,r-1);
			// debug(cur);
			
			if(2*cur == r-l+1){
				w=0;
				break;
			}

			if(2*cur < r-l+1){
				update(1,0,p2-1,l-1,r-1,0);
			}

			else update(1,0,p2-1,l-1,r-1,1);

			// cout<<"upd fin"<<endl;

			// for(int i=1; i<=n; i++){
				// if(tr->query(i-1,i)==1) cout<<"1";
				// else cout<<"0";
			// }
			// cout<<endl;
		}

		// for(int i=0; i<n; i++){
		// 	if(query(1,0,p2-1,i,i)==1) cout<<"1";
		// 	else cout<<"0";
		// }
		// cout<<endl;

		for(int i=1; i<=n; i++){
			if((query(1,0,p2-1,i-1,i-1)==1) != (s[i-1]=='1')) w=0;
		}

		cout<<(w?"YES\n":"NO\n");

		for(int i=0; i<n; i++){
			st[i+p2]=0;
			lazy[i+p2]=-1;
		}

		for(int i=p2; i<p2+n; i++){
			int j=int(i/2);
			while(j>0){
				st[j]=0;
				lazy[j]=-1;
				j/=2;
			}
		}
	}
}