Problem: The cloth coasters produced and sold by Aizu Takada City are known for their symmetrical design and great beauty. As part of quality control, Aizu Takada City has installed cameras on the production line to automatically verify that the images obtained by shooting each coaster are symmetrical. Each coaster is represented as a square black and white image of N x N pixels. Each pixel has a value of 0 or 1 corresponding to a white or black image.

This time, the software of the image analysis system will be updated along with the equipment update of the production line. The new system has been devised to reduce the amount of communication data, and data is sent from the camera to the analysis system by the following method.

* The information of the first coaster flowing on the line is sent to the system as an N × N pixel image.
* For the coaster information on the second and subsequent images, only the difference from the previous image is sent. The difference is given as a set of pixel positions that change from "0 to 1" or "1 to 0".



For C coasters, enter the pixel information of the first image and the difference information of the following C-1 image, and create a program that reports the number of coasters that are vertically symmetrical and symmetrical.



Input

The input is given in the following format.


C N
p11p12 ... p1N
p21p22 ... p2N
::
pN1pN2 ... pNN
diff1
diff2
::
diffC-1


The first line gives the number of coasters C (1 ≤ C ≤ 10000) and the number of pixels N (2 ≤ N ≤ 1000 and N is even) in the vertical and horizontal directions of the image. Lines 2 to N + 1 are given the number pij (pij is 0 or 1) in rows N x columns N representing the pixels of the image of the first coaster.

After the N + 2nd line, the difference diffi representing the information of the 2nd and subsequent coasters is given in the following format.


D
r1 c1
r2 c2
::
rD cD


The number of changed pixels D (0 ≤ D ≤ 100) is given in the first line. The following D rows are given ri and ci (1 ≤ ri, ci ≤ N), which represent the row and column numbers of the changed pixels, respectively. The same position cannot be given more than once in diffi.

Output

The number of coasters that are vertically symmetrical and symmetrical is output on one line.

Examples

Input

7 8
00100000
00011000
10111101
01100110
01000110
10111101
00011000
00100100
2
5 3
1 6
1
6 8
3
6 8
3 3
3 6
2
6 3
6 6
0
2
3 8
6 8


Output

3


Input

1 6
000000
000000
010010
010010
000000
000000


Output

1


Input

2 2
00
00
4
1 1
1 2
2 1
2 2


Output

2

Solution (in CPP):

Solution:
#include<iostream>
#include<string>
using namespace std;

char p[1100][1100];

int main(){

	int C=0;//布の枚数
	int N=0;//横＆縦の行数
	
	int D=0;
	int Y=0;//r
	int X=0;//c
	int henkou=0;
	int kioku=0; //対象かどうかを見るときに一時的に格納する変数
	int out=0;//対象になっていないことを記憶
	int aout=0;//内容変更によって対称かを記憶する
	int error=0;//対象になってない組の個数
	
	int G[100];//変更するX座標
	int H[100];//変更するY座標
	
	int i=0;
	int j=0;
	int d=0;
	int in=0;
	int A=0;
	int x=0;
	int y=0;
                
    cin>>C;
	cin>>N;	
	for(i=0;i<N;i++){
		cin>>p[i];
	}	
	/*
	for(y=0;y<N;y++){
	    for(x=0;x<N;x++){
	        cout<<p[y][x];
	    }
	    cout<<endl;
	}
	*/
	
	/////////一週目の処理/////////////////
	for(Y=0;Y<N/2;Y++){
		for(X=0;X<N/2;X++){
			out=0;
			kioku=p[Y][X];
				if(p[Y][N-1-X]!=kioku){
					out=1;
				}//左右対称かを見る
				
				if(p[N-1-Y][X]!=kioku){
					out=1;
				}//上下が対称か見る
				
				if(p[N-1-Y][N-1-X]!=kioku){
					out=1;
				}//斜めに対称か見る
						
			if(out==1){
				error=error+1;
			}
		}
	}
	
	//cout<<error<<endl;
	
	//-----------------------------------------------------------
	if(error==0){
		A=A+1;    //一枚目対称象だった
	}

        //////////////////// ////////////////////////////////////////////////////

	//////二週目以降（ループ）変更点のみを計算//////
	
	for(i=0;i<C-1;i++){
//		cout<<"/////////////////"<<endl; 
			
		///変更///
		cin>>D;     
		for(j=0;j<D;j++){
			cin>>H[j]>>G[j];
		                                  
	    	out=0;
	    	aout=0;
			///////////要変更/////////////////////
		    kioku=p[H[j]-1][G[j]-1];                          
			if(kioku!=p[H[j]-1][N-G[j]] || kioku!=p[N-H[j]][G[j]-1] || kioku!=p[N-H[j]][N-G[j]]){//--------------------
                //左右反転座標              //上下反転座標              //上下左右反転座標
				out=1;//完全対称になっていない
			}
			/*if(kioku==p[H[j]-1][N-G[j]] && kioku==p[N-H[j]][G[j]-1] && kioku==p[G[j]-1][H[j]-1]){
				out=0;
			}
			*/
			/////////////////////////////////////////
			
			//内容の変更//
			if(p[H[j]-1][G[j]-1]=='0'){
				p[H[j]-1][G[j]-1]='1';
				//cout<<"ok";
				//cout<<p[H[j]-1][G[j]-1]<<endl;
			}else{
				p[H[j]-1][G[j]-1]='0';
			    //cout<<"ok";
			    //cout<<p[H[j]-1][G[j]-1]<<endl;
			}
			
			
//				cout<<p[0];
			
////////////////////////
			
			///////
			
			///要変更///////////////////////////////////
			kioku=p[H[j]-1][G[j]-1];			
			if(kioku!=p[H[j]-1][N-G[j]] || kioku!=p[N-H[j]][G[j]-1] || kioku!=p[N-H[j]][N-G[j]]){//--------------------
                                      //左右反転座標              //上下反転座標                                            //上下左右反転座標
				aout=1;//完全対称になっていない
				//cout<<"非対称"<<endl;
			}/*
			if(kioku==p[H[j]-1][N-G[j]] && kioku==p[N-H[j]][G[j]-1] && kioku==p[N-H[j]][N-G[j]]){
				aout=0;
			}*/
			
			/////////////////////////////////////////////
			
			if(out==0 && aout==1){//対称が崩れたとき
				error=error+1;
		//		cout<<"崩れた"<<endl;
			}
			if(out==1 && aout==0){//対称になったとき
				error=error-1;
		//		cout<<"対称になった"<<endl;
			}
			/*
			for(d=0;d<N;d++){
			    cout<<p[d]<<endl;
			}
			cout<<endl;
			*/
		}
		
		//out<<error<<endl;
		
		if(error==0){
			A=A+1;
		}
		//cout<<A<<endl;		
		//////
		//cout<<"-----------------"<<endl;

    }

cout<<A<<endl;




                 
}