#include using namespace std; typedef pair pii; typedef long long ll; #define F first #define S second const int MAXN = 2e5 + 10; const int SQ = MAXN/ 1900; int n, m, q, tl[MAXN], tr[MAXN], mark[MAXN]; vector vec[MAXN], sec[MAXN]; vector toUpd[MAXN]; int seg[MAXN<<2]; bool ans[MAXN]; void change(int v, int b, int e, int pos, int val){ if (e - b == 1){ seg[v] = val; return; } int mid = b + e >> 1; if (pos < mid) change(v<<1, b, mid, pos, val); else change(v<<1^1, mid, e, pos, val); seg[v] = max(seg[v<<1], seg[v<<1^1]); } int get(int v, int b, int e, int l, int r){ if (l <= b && e <= r) return seg[v]; if (r <= b || e <= l) return -1; int mid = b + e >> 1; return max(get(v<<1, b, mid, l, r), get(v<<1^1, mid, e, l, r)); } int main(){ ios::sync_with_stdio(false); cin.tie(0); int te; cin >> te; while (te--){ memset(seg, -1, sizeof(seg)); cin >> n >> m; for (int i = 0; i <= n; i++) sec[i].clear(), toUpd[i].clear(); for (int i = 0; i < m; i++){ cin >> tl[i] >> tr[i], tl[i]--, tr[i]--; if (tl[i] > tr[i]) swap(tl[i], tr[i]); toUpd[tr[i]].push_back(tl[i]); } cin >> q; for (int i = 0; i < q; i++){ vec[i].clear(); ans[i] = true; int k; cin >> k; if (k >= SQ){ while (k--){ int l, r; cin >> l >> r, l--; for (; l < r; l++) mark[l] = i+1; } for (int j = 0; j < m; j++) if (mark[tl[j]] == i+1 && mark[tr[j]] == i+1) { ans[i] = false; break; } } else{ vec[i].resize(k); for (int j = 0; j < k; j++) cin >> vec[i][j].F >> vec[i][j].S, vec[i][j].F--; sort(vec[i].begin(), vec[i].end()); for (int j = 0; j < k; j++) sec[vec[i][j].S].push_back({i, j}); } } for (int t = 1; t <= n; t++){ for (int l: toUpd[t-1]) change(1, 0, n, l, t-1); for (auto x: sec[t]) for (int i = 0; i <= x.S && ans[x.F]; i++) if (get(1, 0, n, vec[x.F][i].F, vec[x.F][i].S) >= vec[x.F][x.S].F) ans[x.F] = false; } for (int i = 0; i < q; i++) if (ans[i]) cout << "YES\n"; else cout << "NO\n"; } return 0; }