Language: C

//Less_thanまでの動作確認完了状態
//一致時のカウントミス対策検討 原因は理解した。　ｎ　－　未満　が　超える　とならないので。一致の場合に狂う
// Ver2

#include <stdio.h>
#include <stdlib.h>

int A[100000];
int B[100000];
int C[100000];
int a[10000];
int c[10000];
int n;
int al, ar, cl, cr;
int tmp = 0;

int tmp_left = -1;
int result = -1;


int cmp(const void *p, const void *q) {
	return *(int*)p - *(int*)q;
}

//#define DEBUG1
//#define DEBUG2
//#define DEBUGF

//#define DEBUGitti//評価１　A一致
//#define DEBUGfin//評価２　A不一致
//#define DEBUG_C_itti//評価１　入力例３の正解の確認

int main() {

	//評価１　A一致
#ifdef DEBUGitti
	n = 10;
	int A[10] = { 0,1,2,3,4,5,6,7,8,9 };
	int B[10] = { 0,1,2,3,4,5,6,7,8,9 };
	int Less_than(int n, int array[], int left, int right, int value);
	int y = Less_than(n, A, 1, 1, B[1]);
	printf("y = %d", y);
#endif
	//評価２　A不一致
#ifdef DEBUGfin
	n = 10;
	int A[10] = { 0,2,4,6,8,10,12,14,16,18 };
	int B[10] = { 0,1,2,3,4,5,6,7,8,9 };
	int Less_than(int n, int array[], int left, int right, int value);
	int y = Less_than(n, A, 0, 1, B[1]);
	printf("y = %d", y);
#endif
	//評価３　入力例３の正解の確認
#ifdef DEBUG_C_itti
	n = 6;
	int A[6] = { 2, 3, 6, 14, 53, 159 };
	int B[6] = { 6, 9, 58, 79, 84, 323 };
	int C[6] = { 2, 50, 79, 288, 383, 2643 };

	int left = 0;
	int right = 9;
	int Less_than(int n, int array[], int left, int right, int value);

	int c_tmp;
	int al = 0;
	int ar = n - 1;
	int cl = 0;
	int cr = n - 1;
	int total = 0;

	for (int i = 0; i < n; i++) {
		a[i] = Less_than(n, A, al, ar, B[i]);
		printf("a[%d]  = %d\n", i, a[i]);

		c[i] = Less_more(n, C, cl, cr, B[i]);
		printf("c[%d]  = %d\n", i, c[i]);

		total = total + (a[i] * c[i]);
		printf("total = %d\n", total);
		getch();
	}

#endif

	int Less_than(int n, int array[], int left, int right, int value);
	int Less_more(int n, int array[], int left, int right, int value);


	//入力作業
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &A[i]);
	}
	for (int i = 0; i < n; i++) {
		scanf("%d", &B[i]);
	}
	for (int i = 0; i < n; i++) {
		scanf("%d", &C[i]);
	}

	//入力値の表示
#ifdef DEBUG1
	for (int i = 0; i < n; i++) {
		printf("A[%d] = %d\n", i, A[i]);
	}
	for (int i = 0; i < n; i++) {
		printf("B[%d] = %d\n", i, B[i]);
	}
	for (int i = 0; i < n; i++) {
		printf("C[%d] = %d\n", i, C[i]);
	}
	printf("\n");
#endif

	//ソート作業
	qsort((void *)A, n, sizeof(int), cmp);
	qsort((void *)B, n, sizeof(int), cmp);
	qsort((void *)C, n, sizeof(int), cmp);

	//ソート結果の表示
#ifdef DEBUG2
	for (int i = 0; i < n; i++) {
		printf("A[%d] = %d\n", i, A[i]);
	}
	for (int i = 0; i < n; i++) {
		printf("B[%d] = %d\n", i, B[i]);
	}
	for (int i = 0; i < n; i++) {
		printf("C[%d] = %d\n", i, C[i]);
	}
#endif

	//演算作業
	//その１　各要素数のカウントデータ収集作業

	//カウントデータ収集作業

	int al = 0;
	int ar = n - 1;
	int cl = 0;
	int cr = n - 1;
	int total = 0;

	for (int i = 0; i < n; i++) {
		a[i] = Less_than(n, A, al, ar, B[i]);
#ifdef DEBUGF
		printf("a[%d]  = %d\n", i, a[i]);
#endif
		//printf("n  = %d\n", n);
		//printf("cl  = %d\n", cl);
		//printf("cr  = %d\n", cr);

		c[i] = Less_more(n, C, cl, cr, B[i]);
#ifdef DEBUGF
		printf("c[%d]  = %d\n", i, c[i]);
#endif
		total = total + (a[i] * c[i]);
	}
#ifdef DEBUGF
	printf("total = %d\n", total);
	getch();
#endif
	printf("%d\n", total);
	getch();
	return 0;
}

/*
関数	：int Less_more(int n, int array[], int left, int right, int value)
概要	：超えるの要素数を取得する
入力値：要素数 : n, 配列 : array[], 開始イテレータ : left, 終了イテレータ : right, 探索データ : x
戻り値：未満の要素数
要件	：配列 : a[]は未ソートで可
：left、right は前方向イテレータの要件を満たす事
*/
int Less_more(int n, int array[], int left, int right, int value) {

	int bin_search(int n, int array[], int left, int right, int value);

	//変数を定義する
	int i;
	int result = -1;
	int s;

	//初期値を入力する
	int lt = -1;
	int flag_err = 0;

	//探索対象データの入力
	int first = left;//開始イテレータの入力:first
	int last = right;//終了イテレータの入力:last

					 //配列のソート：qsort() ＊＊＊＊＊省略＊＊＊＊＊

					 //探索条件データの入力
	s = first;//開始イテレータの入力:first


	if ((first > last) || (first > n - 1) || (last > n - 1)) {//エラーチェック:first > last || first > n-1 || last > n-1
		printf("%s\n", "探索範囲エラーです");
		flag_err = 1;//エラーフラグTrue

					 //エラー処理は後程記述とする
	}
	//if (value >= array[last]) {//エラーチェック:value >= array[last]
	//	printf("%s\n", "このデータ内にはありません");
	//	flag_err = 1;//エラーフラグTrue

	//				 //エラー処理は後程記述とする
	//}
	//エラーでは無い場合
	if (flag_err != 1) {

		//探索する
		int r = bin_search(n, array, s, last, value);//bin_sartch()を実行する
#ifdef DEBUGF
		printf("r = %d\n", r);
#endif
		if (r < 0) {//if (bin_sartch() < 0)  一致無しか？

					//i = left;
#ifdef DEBUG2
			printf("debaggu tmp_left = %d\n", tmp_left);
#endif
			i = tmp_left;

			if (array[i] <= value) {
				if (i == last) {
					lt = last;//一つ右は存在しない。エラーにしないでlastを返すことにした。
				}
				else
				{
					lt = n - i + 1 + 1 - s;//ひとつ右のイテレータ存在するのでそれを返す
				}
			}
			else
			{
				lt = n - i;//このイテレータなのでイテレータを要素数に変換する
			}
		}
		else//一致有り
		{
			lt = n - (r - s) - 1;//イテレータを要素数に変換する
		}

		//結果を返す
		result = lt;
#ifdef DEBUGF
		printf("未満数 result = %d\n", result);
#endif
	}
	else
	{
		//エラーの場合
		printf("%s\n", "エラーです");
	}
#ifdef DEBUGF
	getch();
#endif
	return result;
}

//int main() {
//	int Less_than(int n, int array[], int left, int right, int value);
//
//	//評価１　一致
//#ifdef DEBUGitti
//	int n = 10;
//	int ittiA[] = { 0,1,2,3,4,5,6,7,8,9 };
//	int ittiB[] = { 0,5,9 };
//	int left = 0;
//	int right = n - 1;
//	int value = ittiB[2];
//	int less_than = Less_than(n, ittiA, left, right, value);
//#endif
//
//	//評価２　不一致
//#ifdef DEBUGfin
//	int n = 10;
//	int finA[] = { 2,4,6,8,10,12,14,16,18,20 };
//	int finB[] = { 3,13,19 };
//	int left = 0;
//	int right = n - 1;
//	int value = finB[2];
//	int less_than = Less_than(n, finA, left, right, value);
//#endif
//
//	//評価３　一致（開始位置変更）
//#ifdef DEBUGitti_s
//	int n = 10;
//	int ittiA[] = { 0,1,2,3,4,5,6,7,8,9 };
//	int ittiB[] = { 0,5,9 };
//	int left = 8;
//	int right = n - 1;
//	int value = ittiB[2];
//	int less_than = Less_than(n, ittiA, left, right, value);
//#endif
//
//	//評価４　不一致（開始位置変更）
//#ifdef DEBUGfin_s
//	int n = 10;
//	int finA[] = { 2,4,6,8,10,12,14,16,18,20 };
//	int finB[] = { 3,13,19 };
//	int left = 5;
//	int right = n - 1;
//	int value = finB[1];
//	int less_than = Less_than(n, finA, left, right, value);
//#endif
//
//	//評価５　不一致　範囲外
//#ifdef DEBUGfout
//	int n = 10;
//	int finA[] = { 2,4,6,8,10,12,14,16,18,20 };
//	int finB[] = { 1,21 };
//	int left = 0;
//	int right = n - 1;
//	int value = finB[1];
//	int less_than = Less_than(n, finA, left, right, value);
//#endif
//
//	//評価６　一致（開始位置変更し要素数１）
//#ifdef DEBUGitti_s_min
//	int n = 10;
//	int ittiA[] = { 0,1,2,3,4,5,6,7,8,9 };
//	int ittiB[] = { 0,5,9 };
//	int left = 9;
//	int right = n - 1;
//	int value = ittiB[2];
//	int less_than = Less_than(n, ittiA, left, right, value);
//#endif
//
//	//評価７　一致（開始位置が終了位置超えているエラー）
//#ifdef DEBUGitti_s_min１_err
//	int n = 10;
//	int ittiA[] = { 0,1,2,3,4,5,6,7,8,9 };
//	int ittiB[] = { 0,5,9 };
//	int left = 10;
//	int right = n - 1;
//	int value = ittiB[2];
//	int less_than = Less_than(n, ittiA, left, right, value);
//#endif
//
//	/**********************/
//	printf("less_than = %d\t\ttmp_left = %d\n", less_than, tmp_left);
//	/**********************/
//	getch();
//	return 0;
//}

/*
関数	：int Less_than(int n, int array[], int left, int right, int value)
概要	：未満の要素数を取得する
入力値：要素数 : n, 配列 : array[], 開始イテレータ : left, 終了イテレータ : right, 探索データ : x
戻り値：未満の要素数
要件	：配列 : a[]は未ソートで可
：left、right は前方向イテレータの要件を満たす事
*/
int Less_than(int n, int array[], int left, int right, int value) {

	int bin_search(int n, int array[], int left, int right, int value);

	//変数を定義する
	int i;
	int result = -1;
	int s;

	//初期値を入力する
	int lt = -1;
	int flag_err = 0;

	//探索対象データの入力
	int first = left;//開始イテレータの入力:first
	int last = right;//終了イテレータの入力:last

					 //配列のソート：qsort() ＊＊＊＊＊省略＊＊＊＊＊

					 //探索条件データの入力
	s = first;//開始イテレータの入力:first


	if ((first > last) || (first > n - 1) || (last > n - 1)) {//エラーチェック:first > last || first > n-1 || last > n-1
		printf("%s\n", "探索範囲エラーです");
		flag_err = 1;//エラーフラグTrue

					 //エラー処理は後程記述とする
	}
	if (value < array[first]) {//エラーチェック:value < array[first]
		printf("%s\n", "このデータ内にはありません");
		flag_err = 1;//エラーフラグTrue

					 //エラー処理は後程記述とする
	}
	//エラーでは無い場合
	if (flag_err != 1) {

		//探索する
		int r = bin_search(n, array, s, last, value);//bin_sartch()を実行する
#ifdef DEBUGF
		printf("r = %d\n", r);
#endif
		if (r < 0) {//if (bin_sartch() < 0)  一致無しか？

					//i = left;
#ifdef DEBUG2
			printf("debaggu tmp_left = %d\n", tmp_left);
#endif
			i = tmp_left;

			if (array[i] >= value) {
				if (i == s) {
					//lt = -1;//一つ左は存在しない。対象配列内に該当なしエラーなので - 1
					lt = 0;////一つ左は存在しない。エラーにしないで0を返すことにした。
				}
				else
				{
					lt = i + 1 - 1 - s;//ひとつ左のイテレータ存在するのでそれを返す
				}
			}
			else
			{
				lt = i - s;//イテレータを要素数に変換する
			}
		}
		else//一致有り
		{
			lt = r - s;//イテレータを要素数に変換する
		}

		//結果を返す
		result = lt;
#ifdef DEBUGF
		printf("未満数 result = %d\n", result);
#endif
	}
	else
	{
		//エラーの場合
		printf("%s\n", "エラーです");
	}
#ifdef DEBUGF
	getch();
#endif
	return result;
}

////int bin_search(int n, int array[], int left, int right, int value);
////Ver3
//
//#include <stdio.h>
//#include <stdlib.h>
//
//#define DEBUG1
//#define DEBUG2
//#define DEBUGF
//
////#define DEBUGitti//評価１　一致
////#define DEBUGfin//評価２　不一致
////#define DEBUGitti_s//評価３　一致（開始位置変更）
////#define DEBUGfin_s//評価４　不一致（開始位置変更）
////#define DEBUGfout//評価５　不一致　範囲外
////#define DEBUGitti_s_min//評価６　一致（開始位置変更し要素数１）
////#define DEBUGitti_s_min１_err//評価７　一致（開始位置が終了位置超えているエラー）
//
////プロトタイプ宣言
//int bin_search(int n, int array[], int left, int right, int value);
//
//int main() {
//
//	//評価１　一致
//#ifdef DEBUGitti
//	int n = 10;
//	int ittiA[] = { 0,1,2,3,4,5,6,7,8,9 };
//	int ittiB[] = { 0,5,9 };
//	int left = 0;
//	int right = n - 1;
//	int value = ittiB[1];
//	bin_search(n, ittiA, left, right, value);
//#endif
//
//	//評価２　不一致
//#ifdef DEBUGfin
//	int n = 10;
//	int finA[] = { 2,4,6,8,10,12,14,16,18,20 };
//	int finB[] = { 3,13,19 };
//	int left = 0;
//	int right = n - 1;
//	int value = finB[0];
//	bin_search(n, finA, left, right, value);
//#endif
//
//	//評価３　一致（開始位置変更）
//#ifdef DEBUGitti_s
//	int n = 10;
//	int ittiA[] = { 0,1,2,3,4,5,6,7,8,9 };
//	int ittiB[] = { 0,5,9 };
//	int left = 9;
//	int right = n - 1;
//	int value = ittiB[1];
//	bin_search(n, ittiA, left, right, value);
//#endif
//
//	//評価４　不一致（開始位置変更）
//#ifdef DEBUGfin_s
//	int n = 10;
//	int finA[] = { 2,4,6,8,10,12,14,16,18,20 };
//	int finB[] = { 3,13,19 };
//	int left = 8;
//	int right = n - 1;
//	int value = finB[2];
//	bin_search(n, finA, left, right, value);
//#endif
//
//	//評価５　不一致　範囲外
//#ifdef DEBUGfout
//	int n = 10;
//	int finA[] = { 2,4,6,8,10,12,14,16,18,20 };
//	int finB[] = { 1,21 };
//	int left = 0;
//	int right = n - 1;
//	int value = finB[1];
//	bin_search(n, finA, left, right, value);
//#endif
//
//	//評価６　一致（開始位置変更し要素数１）
//#ifdef DEBUGitti_s_min
//	int n = 10;
//	int ittiA[] = { 0,1,2,3,4,5,6,7,8,9 };
//	int ittiB[] = { 0,5,9 };
//	int left = 9;
//	int right = n - 1;
//	int value = ittiB[2];
//	bin_search(n, ittiA, left, right, value);
//#endif
//
//	//評価７　一致（開始位置が終了位置超えているエラー）
//#ifdef DEBUGitti_s_min１_err
//	int n = 10;
//	int ittiA[] = { 0,1,2,3,4,5,6,7,8,9 };
//	int ittiB[] = { 0,5,9 };
//	int left = 10;
//	int right = n - 1;
//	int value = ittiB[2];
//	bin_search(n, ittiA, left, right, value);
//#endif
//
//	getch();
//	return 0;
//}

/*
関数	：int bin_search(int n, int array[], int left, int right, int value)
概要	：二分探索を実行する
入力値：配列 : array[], 開始イテレータ : left, 終了イテレータ : right, 探索データ : value
戻り値：一致ありの場合	：一致要素のイテレータを返す
：一致無しの場合：-1を返す　tmp_leftに最終探索時のleftを入力する
要件	：配列 : array[]は昇順にソート済である事
：left、right は前方向イテレータの要件を満たす事
*/
int bin_search(int n, int array[], int left, int right, int value) {
	int flag_err = -1;
	int result = -1;
	//int tmp_left = -1;// グローバル化に付き
	int mid;


	//入力エラー検出
	//if ((left > right) || (left > n - 1) || (right > n - 1)) {//エラーチェック:(left > right) || (left > n - 1) || (right > n - 1)
	//	printf("%s\n", "探索範囲エラーです");
	//	flag_err = 1;//エラーフラグTrue

	//				 エラー処理は後程記述とする
	//}
	//if (value < array[left]) {//エラーチェック:value < array[first]
	//	printf("%s\n", "このデータ内にはありません");
	//	flag_err = 1;//エラーフラグTrue

	//				 エラー処理は後程記述とする
	//}
	//エラーでは無い場合
	if (flag_err != 1) {

#ifdef DEBUG1
		printf("value = %d\n", value);
#endif
		while (left <= right) {

			mid = (left + right) / 2;
#ifdef DEBUG1
			printf("left = %d\t mid = %d\t right = %d\n", left, mid, right);
#endif
			if (array[mid] == value) {
#ifdef DEBUG1
				printf("array[%d]=%d == %d\n", mid, array[mid], value);
#endif
				result = mid;

				left = right + 1;
			}
			if (array[mid] > value) {
#ifdef DEBUG1
				printf("array[%d]=%d > %d\n", mid, array[mid], value);
#endif
				right = mid - 1;
			}
			if (array[mid] < value) {
#ifdef DEBUG1
				printf("array[%d]=%d < %d\n", mid, array[mid], value);
#endif
				left = mid + 1;
			}
		}

		if (result >= 0) {

#ifdef DEBUG1
			printf("%s", "二分探索 一致あり ");
#endif
		}
		else
		{
			//	if (left <= right) {
			tmp_left = left;
			//	}
#ifdef DEBUG1
			printf("%s", "二分探索 一致無し　 ");
#endif
		}
	}
#ifdef DEBUG2
	printf("result = %d\t\ttmp_left = %d\n", result, tmp_left);
#endif
	return result;
}

Compiler output:
main.c: In function 'main':
main.c:164:9: error: implicit declaration of function 'getch'; did you mean 'getc'? [-Wimplicit-function-declaration]
  164 |         getch();
      |         ^~~~~
      |         getc