booldfs(int p){ bool is = 0; for (int i = 0; i < (int)g[p].size(); ++i) { int e = g[p][i]; if (d[e] == -1) { z[p].push_back(e); z[e].push_back(p); d[e] = d[p] ^ 1; is |= dfs(e); } elseif (d[e] == d[p]) is = 1; } return is; }
voidsolve(){ for (int i = 1; i <= n; ++i) d[i] = -1; for (int i = 1; i <= n; ++i) if (d[i] == -1) { d[i] = 0; if (dfs(i)) z[i].push_back(i); } }
voidcalc(int x, int y){ if (x > y) swap(x, y); if (vis[x][y]) return; staticqueue<pii> q; vis[x][y] = 1; q.push(mkp(x, y)); while (!q.empty()) { x = q.front().first; y = q.front().second; q.pop(); for (int i = 0; i < (int)z[x].size(); ++i) for (int j = 0; j < (int)z[y].size(); ++j) { int xx = z[x][i], yy = z[y][j]; if (xx > yy) swap(xx, yy); if (!vis[xx][yy] && s[xx] == s[yy]) { vis[xx][yy] = 1; q.push(mkp(xx, yy)); } } } }
intmain(){ scanf("%d%d%d", &n, &m, &q); scanf("%s", s + 1); for (int i = 1; i <= m; ++i) scanf("%d%d", &l[i], &r[i]); for (int i = 1; i <= m; ++i) if (s[l[i]] == '0' && s[r[i]] == '0') { g[l[i]].push_back(r[i]); g[r[i]].push_back(l[i]); } solve(); for (int i = 1; i <= n; ++i) g[i].clear(); for (int i = 1; i <= m; ++i) if (s[l[i]] == '1' && s[r[i]] == '1') { g[l[i]].push_back(r[i]); g[r[i]].push_back(l[i]); } solve(); for (int i = 1; i <= n; ++i) g[i].clear(); for (int i = 1; i <= m; ++i) if (s[l[i]] != s[r[i]]) { g[l[i]].push_back(r[i]); g[r[i]].push_back(l[i]); } solve(); for (int i = 1; i <= n; ++i) calc(i, i); for (int i = 1; i <= m; ++i) if (s[l[i]] == s[r[i]]) calc(l[i], r[i]); while (q--) { int x, y; scanf("%d%d", &x, &y); if (x > y) swap(x, y); printf("%s\n", vis[x][y] ? "YES" : "NO"); } }