#include using namespace std; #define rep(i,n) for(int i = 0; i < (n); i++) typedef long long ll; typedef long double ld; typedef pair P; struct UnionFind{ vector data; int __size; UnionFind(int sz) { data.assign(sz, -1); __size = sz; } bool unite(int x, int y) { x = find(x), y = find(y); if(x == y) return (false); if(data[x] > data[y]) swap(x, y);//親は負でサイズを保存 __size--; data[x] += data[y]; data[y] = x; return (true); } int find(int k) { if(data[k] < 0) return (k); return (data[k] = find(data[k])); } bool same(int x, int y){ return find(x) == find(y); } int size(int k) { return (-data[find(k)]); } int union_count() { return (__size); } }; int main() { int n, m, q; cin >> n >> m >> q; vector s(n); vector> g(n); rep(i,n) cin >> s[i]; rep(i,m) { int u, v; cin >> u >> v; u--; v--; g[u].emplace_back(v); g[v].emplace_back(u); } UnionFind uf(n * 7); for (int i = 0; i < n; i++) { for (int j = 0; j < 7; j++) { if (s[i][j] == '0') continue; for (auto k : g[i]) if (s[k][j] == '1') uf.unite(i * 7 + j, k * 7 + j); int a = (j + 1) % 7, b = (j - 1 + 7) % 7; if (s[i][a] == '1') uf.unite(i * 7 + j, i * 7 + a); if (s[i][b] == '1') uf.unite(i * 7 + j, i * 7 + b); } } while (q--) { int t, u, x; cin >> t >> u >> x; u--; x--; if (t == 1) { s[u][x] = '1'; for (auto v : g[u]) if (s[v][x] == '1') uf.unite(u * 7 + x, v * 7 + x); int a = (x + 1) % 7, b = (x - 1 + 7) % 7; if (s[u][a] == '1') uf.unite(u * 7 + x, u * 7 + a); if (s[u][b] == '1') uf.unite(u * 7 + x, u * 7 + b); } else { cout << uf.size(u * 7) << endl; } } return 0; }