processors=1024 // number of processors is n * n
def number[33]
def matrix[33][33]
def ranking[33]

// set up the numbers to work on
number[1]=21
number[2]=22
number[3]=2
number[4]=1
number[5]=-21
number[6]=-22
number[7]=-2
number[8]=-1
number[9]=210
number[10]=220
number[11]=20
number[12]=10
number[13]=-210
number[14]=-220
number[15]=-20
number[16]=-10
number[17]=-15
number[18]=2105
number[19]=2205
number[20]=205
number[21]=105
number[22]=-2105
number[23]=-2205
number[24]=-205
number[25]=-105
number[26]=21059
number[27]=22059
number[28]=2059
number[29]=1059
number[30]=-21059
number[31]=-22059
number[32]=-2059


n=32	// size of input

j%=pid-1

firstindex%=j%/n
firstindex%=firstindex%+1	// first index

call mod	// mod for the second index
sync

// work out matrix for each number against each other number

if (number[firstindex%] <= number[secondindex%])
{
	matrix[firstindex%][secondindex%]=1
} else {
	matrix[firstindex%][secondindex%]=0
}


// work out each processor's index for the matrix

thingplus%=secondindex%*2
thing%=thingplus%-1


sync

// sum each row in the matrix

	f=n+1
	f=f/2	
	k=0
	while (f>=secondindex%)
	{		
		one%=matrix[firstindex%][thing%]
		two%=matrix[firstindex%][thingplus%]
		result%= one%+ two%

		if (k==1)	// if there is an odd number of elements
		{
			if (secondindex%==f)
			{
				matrix[firstindex%][secondindex%]=one%
				
			} else {
				matrix[firstindex%][secondindex%]=result%
			}
			k=0
		} else {
			matrix[firstindex%][secondindex%]=result%
		}

		b=f.2
		f=f/2
		
		if (b!=0)	// is there an odd number of elements?
		{
			if (f!=0)
			{
				f=f+1
				k=1
			}
		}
	}
sync

// display each element in its order


if (pid <=n)
{
	x=1
	yt%=matrix[pid][x]
	ranking[yt%]=number[pid]

	println ranking%
}



proc mod	// to perform the mod function for the secondindex
{
	secondindex%=pid
	secondindex%--
	valtowork%=secondindex%/n
	mulval%=valtowork%*n
	if (valtowork% > 0)
	{
		secondindex%=pid-mulval%		
	} else {
		secondindex%=pid
	}	
}
