#include #define rep(i,n) for(int i = 0; i < (n); ++i) #define drep(i,n) for(int i = (n)-1; i >= 0; --i) #define srep(i,s,t) for (int i = s; i < t; ++i) using namespace std; typedef long long int ll; typedef pair P; #define yn {puts("Yes");}else{puts("No");} const int MAX_N = 1000100; int par[MAX_N]; // 親 int rank_[MAX_N]; // 木の深さ int cnt_[MAX_N]; // 属する頂点の個数(親のみ正しい) // n要素で初期化 void UFinit(){ for(int i=0;i G[MAX_N]; int main() { UFinit(); int n, m, q; cin >> n >> m >> q; string s[n]; rep(i,n) cin >> s[i]; rep(i,m){ int u, v; cin >> u >> v; u--; v--; G[u].push_back(v); G[v].push_back(u); } rep(i,n){ rep(j,7){ if(s[i][j]=='1'&&s[i][(j+1)%7]=='1'){ unite(i*7+j,i*7+(j+1)%7); } } rep(jj,G[i].size()){ int j = G[i][jj]; rep(k,7){ if(s[i][k]=='1'&&s[j][k]=='1'){ unite(i*7+k,j*7+k); } } } } rep(i,q){ int t, x, y; cin >> t >> x >> y; if(t == 1){ x--; y--; s[x][y] = '1'; rep(j,7){ if(s[x][j]=='1'&&s[x][(j+1)%7]=='1'){ unite(x*7+j,x*7+(j+1)%7); } } rep(jj,G[x].size()){ int j = G[x][jj]; if(s[x][y]=='1'&&s[j][y]=='1'){ unite(x*7+y,j*7+y); } } }else{ x--; cout << cnt_[find(x*7)] << endl; } } return 0; }