#include <iostream>
#include <cstdlib>
using namespace std;
int ptrR=0;
int ptrC=0;
int **init_a(int **a, int n1, int n2) {
	
	if(ptrR==0 && ptrC==0){
		ptrR=n1;
		ptrC=n2;
		a=new int*[ptrR];
		for(int i=0; i<ptrR; i++) {
			a[i]=new int [ptrC];
		}
		for(int i=0; i<ptrR; i++) {
			for(int j=0; j<ptrC; j++) {
				a[i][j]=rand()%2;
			}
		}
		return a;
	}
	else {
		ptrR+=n1;
		ptrC+=n2;
		int **b = new int *[ptrR];
		
		for(int i=0; i<ptrR; i++) {
			b[i]=new int [ptrC];
		}
		for(int i=0; i<ptrR; i++) {
			for(int j=0; j<ptrC; j++) {
				if(i<ptrR-n1 && j<ptrC-n2)
					b[i][j]=a[i][j];
				else
					b[i][j]=rand()%2;
			}
		}	
		for(int i=0;i<ptrR-n1;i++)
		       delete [] a[i];
		delete [] a;
		return b;
		
	}
}

void print_2D(int **a,int n1, int n2) {
	cout<<"The 2D array is: "<<endl;
	for(int i=0; i<n1; i++) {
		for(int j=0; j<n2; j++) {
			cout<<a[i][j]<<"\t";
		}
		cout<<endl;
	}
	cout<<"The address of every number is: "<<endl;
	for(int i=0; i<n1; i++) {
		for(int j=0; j<n2; j++) {
			cout<<&a[i][j]<<"\t";
		}
		cout<<endl;
	}
}

int main(){
	int **a=nullptr;
	cout<<"\n 3x3"<<endl;
	a=init_a(a,3,3);
	print_2D(a,3,3);
	cout<<"\n 4x4"<<endl;
	a=init_a(a,1,1);
	print_2D(a,4,4);
	cout<<"\n 4x6"<<endl;
	a=init_a(a,0,2);
	print_2D(a,4,6);
	cout<<"\n 6x6"<<endl;
	a=init_a(a,2,0);
	print_2D(a,6,6);
	for(int i=0;i<ptrR;i++)
	        delete [] a[i];
	delete []a;

	return 0;
}
