//
// Program 6: merging/ranking
//

#include <xmtc.h>
#include <xmtio.h>

#define n 16
#define log_n 4

void print_row(int* row,int numvals)
{
	int i;
	for(i=1;i<=numvals;i++)
	{
	   if(row[i]<10)
		   printf(" ");
		printf("%d",row[i]);
		printf(" ");
	}
	printf("\n");
}
int main()
{
	// ASSUME: elements are pairwise distinct
	int A[n+1];         // monotonically non-decreasing data
	int B[n+1];         // monotonically non-decreasing data
	int rank_in_B[n+1]; // slot "i" is the rank of A[i] in B
	int rank_in_A[n+1]; // slot "i" is the rank of B[i] in A
	int C[2*n+1];       // the merged data

	A[1]= 4; A[2] = 6; A[3] = 8; A[4] = 9; A[5] =16; A[6] =17; A[7] =18; A[8] =19;
	A[9]=20; A[10]=21; A[11]=23; A[12]=25; A[13]=27; A[14]=29; A[15]=31; A[16]=32;

	B[1]= 1; B[2] = 2; B[3] = 3; B[4] = 5; B[5] = 7; B[6] =10; B[7] =11; B[8] =12;
	B[9]=13; B[10]=14; B[11]=15; B[12]=22; B[13]=24; B[14]=26; B[15]=28; B[16]=30;

	spawn(1,n)
	{
		int i;
		i=$;
		rank_in_B[i]=0; // everything in A comes before everything in B
		rank_in_A[i]=n; // NOTE: this isn't really true --> FIX THIS
	}

	spawn(1,n)
	{
		int i;
		i=$;
		C[i+rank_in_B[i]]=A[i];
		C[i+rank_in_A[i]]=B[i];
	}

	printf("\n");
	print_row(A,n);
	printf("\n");
	print_row(B,n);
	printf("\n");
	print_row(C,2*n);
	printf("\n");
	printf("\n");
	print_row(rank_in_B,n);
	printf("\n");
	print_row(rank_in_A,n);
	printf("\n");
}
