#include <bits/stdc++.h>
#include <iostream>
#include <math.h>
#include <vector>
#include <deque>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stdio.h>
#include <cstdlib>
#include <random>
#include <chrono>
#include <fstream>
using namespace std;
typedef unsigned long long int ul;
typedef int ll;
typedef long double ld;
mt19937 rng((unsigned int)chrono::steady_clock::now().time_since_epoch().count());
#define mod 1000000007LL
#define sgraph 200100LL
#define segment 800100LL
#define all(V) V.begin(),V.end()
vector<ll> seg(segment);
vector<bool> marked(segment);
map<ll,ll> mp;
string F,S;
void push(ll v){
    if(marked[v]){
        seg[2*v]=min(seg[v],mp[2*v]);
        seg[2*v+1]=min(seg[v],mp[2*v+1]);
        marked[v]=false;
        marked[2*v]=marked[2*v+1]=true;
    }
}
void build(ll v,ll l,ll r){
    if(l==r){
        if(F[l-1]=='0'){
            seg[v]=0;
        }
        else{
            seg[v]=1;
        }
        mp[v]=r-l+1;
    }
    else{
        ll m=l+r;
        m/=2;
        build(2*v,l,m);
        build(2*v+1,m+1,r);
        seg[v]=seg[2*v]+seg[2*v+1];
        mp[v]=r-l+1;
    }
}
ll get1(ll v,ll l,ll r,ll ql,ll qr){
    if(l==ql&&r==qr){
        return seg[v];
    }
    else{
        push(v);
        ll m=l+r;
        m/=2;
        if(qr<=m){
            return get1(2*v,l,m,ql,qr);
        }
        else if(ql>m){
            return get1(2*v+1,m+1,r,ql,qr);
        }
        else{
            return get1(2*v,l,m,ql,m)+get1(2*v+1,m+1,r,m+1,qr);
        }
    }
}
void update1(ll v,ll l,ll r,ll ql,ll qr,ll val){
    if(l==ql&&r==qr){
        seg[v]=val;
        marked[v]=true;
    }
    else{
        push(v);
        ll m=l+r;
        m/=2;
        if(qr<=m){
            update1(2*v,l,m,ql,qr,min(m-l+1,val));
        }
        else if(ql>m){
            update1(2*v+1,m+1,r,ql,qr,min(r-m,val));
        }
        else{
            update1(2*v,l,m,ql,m,min(m-l+1,val));
            update1(2*v+1,m+1,r,m+1,qr,min(r-m,val));
        }
        seg[v]=seg[2*v]+seg[2*v+1];
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    ll T;
    cin>>T;
    while(T--){
        ll n,q;
        cin>>n>>q;
        S.clear();
        F.clear();
        mp.clear();
        cin>>S>>F;
        for(ll i=0;i<4*n;i++){
            seg[i]=0;
            marked[i]=false;
        }
        build(1,1,n);
        vector<pair<ll,ll>> pi(q);
        for(ll i=0;i<q;i++){
            cin>>pi[i].first>>pi[i].second;
        }
        reverse(all(pi));
        ll f=0;
        for(ll i=0;i<q;i++){
            ll l=pi[i].first;
            ll r=pi[i].second;
            ll temp=get1(1, 1, n, l, r);
            ll t2=r-l+1-temp;
            if(temp<t2){
                update1(1, 1, n, l, r, 0);
            }
            else if(temp>t2){
                update1(1, 1, n, l, r, r-l+1);
            }
            else{
                f=1;
                break;
            }
        }
        if(f){
            cout<<"NO\n";
        }
        else{
            for(ll i=1;i<=n;i++){
                char ttt='0';
                if(get1(1, 1, n, i, i)){
                    ttt='1';
                }
                if(ttt!=S[i-1]){
                    f=1;
                    break;
                }
            }
            if(f){
                cout<<"NO\n";
            }
            else
                cout<<"YES\n";
        }
    }
}



