#include<stdio.h>
#include<stdlib.h>
#include<mpi.h>


int per_process_data=0;

int main(int argc, char ** argv)
{
  
  int total_data,ierr, process_size, myrank,  **in, **recv, count, i, j, k, receive;
    
  MPI_Status status1;  
  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &process_size); 
  MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
  
  total_data = getvalue();
  per_process_data = total_data / (process_size-1);
  
  //  printf("Process data is : %d\n",per_process_data);
  
  if(myrank==0)
    {
      
      in = (int **) malloc (process_size * sizeof(int *));
      printf("Enter elements \n");
      for(i=0; i<process_size; i++)
	in[i]= (int *) malloc (per_process_data * sizeof(int));
      
      k=0;     
      for(i=1; i<process_size; i++)
	{
	  j=0;
	  while(j<per_process_data && k<total_data)
	    {
	      scanf("%d",&in[i][j]);
	      j++;
	      k++;
	    }
	}
      printf("Elements are :\n");
      k=0;
      for(i=1; i<process_size; i++)
	{
	  j=0;
	  printf("\n");
	  while(j<per_process_data &&  k<total_data)
	    {
	      printf("%d\t",in[i][j]);
	      j++;
	      k++;
	    }
	}
        for(i=1; i<process_size; i++)
	  {
	    ierr=MPI_Send(&in[i], per_process_data, MPI_INT, i, 1, MPI_COMM_WORLD);
	    printf("\nSend value is:%d\n",ierr);
	  }
    }
  
  else
    {
      recv = (int **) malloc (process_size * sizeof(int *));
      
      recv[myrank]= (int *)malloc(per_process_data * sizeof(int));
      receive= MPI_Recv(&recv[myrank], per_process_data, MPI_INT, 0, 1, MPI_COMM_WORLD, &status1);
      printf("Value of receive is : %d\n", receive);
      printf("Elements of rank %d are:\n",myrank);
      fflush(stdout);
      for(i=0; i<per_process_data; i++)
      	printf("%d\t", recv[myrank][i]);
      fflush(stdout);
      }
      MPI_Finalize();
      
}


int getvalue()
{
  static int cnt=0;
  int n;
  if(cnt == 0)
    {
      printf("Enter total number of elements\n");
      scanf("%d",&n);
      cnt++;
      return n;
    }
  else
    return 0;
}
  
      

