#include <iostream>
#include <mpi.h>
using namespace std;

int main(int argc, char** argv){
	MPI_Init(&argc, &argv);
	int world_size, world_rank;
	MPI_Comm_size(MPI_COMM_WORLD, &world_size);
	MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
	if(world_size!=4){
		if(world_rank==0){
			cerr<<"ERROR: This program requires exactly 4 nodes! Use -np 4"<<endl;
			MPI_Finalize();
			return 1;
		}
	}
	int original_data[4]={100,200,300,400};
	int final_data[4];
	int my_piece_of_data;
	if(world_rank==0){
		cout<<"[BOSS] Scattering array: [100,200,300,400] to the cluster..."<<endl;
	}
	MPI_Scatter(original_data, 1, MPI_INT, &my_piece_of_data, 1, MPI_INT, 0, MPI_COMM_WORLD);
	my_piece_of_data=my_piece_of_data*2;
	cout<<"  ->[NODE "<<world_rank<<"] I doubled my piece. New value: "<<my_piece_of_data<<endl;
	MPI_Gather(&my_piece_of_data, 1, MPI_INT, final_data, 1, MPI_INT, 0, MPI_COMM_WORLD);
	if(world_rank==0){
		cout<<"\n[BOSS] All data gathered! The final processed array is:"<<endl;
		cout<<"[BOSS] ["<<final_data[0]<<", "<<final_data[1]<<", "<<final_data[2]<<", "<<final_data[3]<<"]"<<endl;
	}
	MPI_Finalize();
	return 0;
}
