#include <stdio.h>
#include "mpi.h"
#define TOKTAG 5
#define VERBOSE 1
int main(int argc, char** argv) {
  int me, nproc, src, dst, token;
  MPI_Status status;  
  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &me);
  MPI_Comm_size(MPI_COMM_WORLD, &nproc);
  src = (me == nproc - 1) ? 0 : me + 1;
  dst = (me == 0) ? nproc - 1 : me - 1;
  if (me == 0) {
    token = 0;
    fprintf(stderr, "Token = %i  sent\n", token);
    MPI_Send(&token, 1, MPI_INT, dst, TOKTAG, MPI_COMM_WORLD);
    MPI_Recv(&token, 1, MPI_INT, src, TOKTAG, MPI_COMM_WORLD, &status);
    fprintf(stderr, "Token = %i  arrived back\n", token);
  } else {
    MPI_Recv(&token, 1, MPI_INT, src, TOKTAG, MPI_COMM_WORLD, &status);
    if(VERBOSE)fprintf(stderr, "Node %d passing token = %i\n", me, token);
    token++;
    MPI_Send(&token, 1, MPI_INT, dst, TOKTAG, MPI_COMM_WORLD);
  }
  MPI_Finalize();
  return 0;
}