public static long countSplitInversionsAndMerge(int start, int end, int leftStart, int leftEnd, int rightStart, int rightEnd) {
		int subArray1[] = new int[leftEnd - leftStart + 1];
		int subArray2[] = new int[rightEnd - rightStart + 1];
		
		int count = 0;
		for (int i = leftStart; i <= leftEnd; i++) {
			subArray1[count++] = a[i];
		}
		count = 0;
		for (int i = rightStart; i <= rightEnd; i++) {
			subArray2[count++] = a[i];
		}
		
		// merge and count inversions
		int leftPointer = 0, rightPointer = 0;
		long inversions = 0;
		for (int i = start; i <= end; i++) {
			if(leftPointer >= subArray1.length) {
				a[i] = subArray2[rightPointer++];
				
			}else if(rightPointer >= subArray2.length) {
				a[i] = subArray1[leftPointer++];
				
			}else if (subArray1[leftPointer] <= subArray2[rightPointer]) {
				a[i] = subArray1[leftPointer++];
				
			}else if(subArray1[leftPointer] > subArray2[rightPointer]) {
				for (int j = leftPointer; j < subArray1.length; j++) {
					//System.out.println(subArray1[j] + "," + subArray2[rightPointer]);
				}
				a[i] = subArray2[rightPointer++];
				inversions = inversions + subArray1.length - leftPointer;
			}
		}
		return inversions;
	}