1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| #include<bits/stdc++.h>
using namespace std;
template<typename T>void read(T&x){x=0;int fl=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') fl=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}x*=fl;} template<typename T,typename...Args>inline void read(T&t,Args&...args){read(t);read(args...);}
typedef long long LL; typedef vector<int> vi; typedef pair<int, int> pii; #define mp(x, y) make_pair(x, y) #define pb(x) emplace_back(x)
const int N = 200005;
int n, q, T, l[N], r[N]; string s, f;
struct segTree{ int l, r, cov, cnt; }tr[N<<2]; #define lid id<<1 #define rid id<<1|1 #define mid ((tr[id].l + tr[id].r) >> 1) #define len(id) (tr[id].r - tr[id].l + 1) inline void pushup(int id){ tr[id].cnt = tr[lid].cnt + tr[rid].cnt; } inline void pushdown(int id){ if(tr[id].l == tr[id].r) return; if(tr[id].cov != -1){ tr[lid].cov = tr[id].cov; tr[lid].cnt = len(lid) * tr[lid].cov; tr[rid].cov = tr[id].cov; tr[rid].cnt = len(rid) * tr[rid].cov; tr[id].cov = -1; } } void build(int id, int l, int r){ tr[id].l = l, tr[id].r = r; tr[id].cov = -1, tr[id].cnt = 0; if(tr[id].l == tr[id].r){ tr[id].cnt = (f[tr[id].l-1] == '1'); return; } build(lid, l, mid), build(rid, mid+1, r); pushup(id); } void cover(int id, int l, int r, int val){ pushdown(id); if(tr[id].l == l && tr[id].r == r){ tr[id].cov = val; tr[id].cnt = len(id) * val; return; } if(r <= mid) cover(lid, l, r, val); else if(l > mid) cover(rid, l, r, val); else cover(lid, l, mid, val), cover(rid, mid+1, r, val); pushup(id); } int query(int id, int l, int r){ pushdown(id); if(tr[id].l == l && tr[id].r == r) return tr[id].cnt; if(r <= mid) return query(lid, l, r); else if(l > mid) return query(rid, l, r); else return query(lid, l, mid) + query(rid, mid+1, r); }
string t; void getStr(int id){ pushdown(id); if(tr[id].l == tr[id].r){ t += (tr[id].cnt == 1) + '0'; return; } getStr(lid), getStr(rid); }
int main(){ for(read(T); T; T--){ read(n, q); cin >> s >> f; build(1, 1, n); for(int i = 1; i <= q; i++) read(l[i], r[i]); bool ok = true; for(int i = q; i >= 1; i--){ int num = query(1, l[i], r[i]); if(num * 2 == r[i] - l[i] + 1){ ok = false; break; } cover(1, l[i], r[i], num * 2 > r[i] - l[i] + 1); } t.clear(); getStr(1); ok &= (t == s); puts(ok ? "YES" : "NO"); } return 0; }
|