#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll=long long; template using V = vector; template using P = pair; using vll = V; using vvll = V; #define ALL(v) v.begin(),v.end() template < class T > inline bool chmax(T& a, T b) {if (a < b) { a=b; return true; } return false; } template < class T > inline bool chmin(T& a, T b) {if (a > b) { a=b; return true; } return false; } #define DEBUG_VLL(vec) REP(sz, vec.size()) std::cerr< par; UnionFind(int n) : n(n), par(n, -1) {} // 集合の代表を返す int find(int x) { if (par[x] < 0) return x; return par[x] = find(par[x]); } // x と y が同じ集合に属するかを判別 bool same(int x, int y) { return find(x) == find(y); } // x が属する集合の大きさを返す int size(int x) { return -par[find(x)]; } // x と y を結合 (merge した場合に true を返す) bool unite(int x, int y) { int px = find(x), py = find(y); if (px == py) return false; if (par[px] > par[py]) swap(px, py); par[px] += par[py]; par[py] = px; return true; } }; int main() { cin.tie(0); ios::sync_with_stdio(false); int n, m, q; cin >> n >> m >> q; V s(n); UnionFind uni(7 * n); for (int i = 0; i < n; i++) { cin >> s[i]; for (int ci = 0; ci < 7; ci++) { if (s[i][ci] == '1' and s[i][(ci + 1) % 7] == '1') { uni.unite(ci * n + i, ((ci + 1) % 7) * n + i); } if (s[i][ci] == '1' and s[i][(ci + 6) % 7] == '1') { uni.unite(ci * n + i, ((ci + 6) % 7) * n + i); } } } V< V > nocol(n); for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; u--, v--; nocol[u].emplace_back(v), nocol[v].emplace_back(u); for (int ci = 0; ci < 7; ci++) { if (s[u][ci] == '1' and s[v][ci] == '1') uni.unite(n * ci + u, n * ci + v); } } for (int _q = 0; _q < q; _q++) { int t, x, y; cin >> t >> x >> y; x--, y--; if (t == 1) { s[x][y] = '1'; if (s[x][(y + 1) % 7] == '1') { uni.unite(y * n + x, ((y + 1) % 7) * n + x); } if (s[x][(y + 6) % 7] == '1') { uni.unite(y * n + x, ((y + 6) % 7) * n + x); } for (int e: nocol[x]) { if (s[e][y] == '1') uni.unite(n * y + x, n * y + e); } } else { cout << uni.size(x) << '\n'; } } return 0; }