#include using namespace std; #define rep(i,n) for (int i = 0; i< (n); ++i) #define repi(i, a, b) for (int i = (a); i < (b); ++i) #define all(x) (x).begin(), (x).end() #define fore(i, a) for(auto &i:a) using ll = long long; struct UnionFind { vector ran; vector parent; vector siz; UnionFind(int n):ran(n, 0), parent(n), siz(n, 1){ rep(i, n)parent[i] = i; } ll find(int x) { if(x == parent[x]) return x; return parent[x] = find(parent[x]); } bool issame(int x, int y) { return find(x) == find(y); } void unite(int x, int y) { x = find(x); y = find(y); if(x == y) return; if(ran[x] < ran[y]) swap(x, y); parent[y] = x; if(ran[x] == ran[y]) ran[x]++; siz[x] += siz[y]; return; } int size(int x) { return siz[find(x)]; } }; int main() { int n, m, q; cin >> n >> m >> q; vector s(n); rep(i, n) cin >> s[i]; int N = 7*n; UnionFind uf(N); vector> G(n); rep(i, m){ int u, v; cin >> u >> v; u--;v--; G[u].push_back(v); G[v].push_back(u); rep(i, 7){ if(s[u][i] == '1' && s[v][i] == '1')uf.unite(i*n+u, i*n+v); } } rep(j, n){ rep(i, 7){ if(s[j][i] == '1' && s[j][(i+1)%7] == '1'){ uf.unite(i*n+j, (i+1)%7*n+j); } } } vector> qs(q); rep(i, q){ int t, x, y; cin >> t >> x >> y; qs[i] = {t, --x, --y}; } rep(i, q){ auto[t, x, y] = qs[i]; if(t == 1){ if(s[x][(y+1)%7] == '1')uf.unite(y*n+x, (y+1)%7*n+x); if(s[x][(y-1)%7] == '1')uf.unite(y*n+x, (y+6)%7*n+x); fore(to, G[x]){ if(s[to][y] == '1')uf.unite(y*n+x, y*n+to); } } else{ cout << uf.size(0) << endl; } } }