Problem:
Score : 600 points

Problem Statement

Snuke has an integer sequence, a, of length N. The i-th element of a (1-indexed) is a_{i}.

He can perform the following operation any number of times:

Operation: Choose integers x and y between 1 and N (inclusive), and add a_x to a_y.

He would like to perform this operation between 0 and 2N times (inclusive) so that a satisfies the condition below. Show one such sequence of operations.
It can be proved that such a sequence of operations always exists under the constraints in this problem.

Condition: a_1 \leq a_2 \leq ... \leq a_{N}

Constraints

2 \leq N \leq 50

-10^{6} \leq a_i \leq 10^{6}

All input values are integers.

Input

Input is given from Standard Input in the following format:

N
a_1 a_2 ... a_{N}

Output

Let m be the number of operations in your solution. In the first line, print m.
In the i-th of the subsequent m lines, print the numbers x and y chosen in the i-th operation, with a space in between.
The output will be considered correct if m is between 0 and 2N (inclusive) and a satisfies the condition after the m operations.

Sample Input 1

3
-2 5 -1

Sample Output 1

2
2 3
3 3

After the first operation, a = (-2,5,4).

After the second operation, a = (-2,5,8), and the condition is now satisfied.

Sample Input 2

2
-1 -3

Sample Output 2

1
2 1

After the first operation, a = (-4,-3) and the condition is now satisfied.

Sample Input 3

5
0 0 0 0 0

Sample Output 3

0

The condition is satisfied already in the beginning.

Solution in C (GCC 5.4.1) (judge verdict: Runtime Error)

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

// 内部定数
#define D_ARRAY_MAX		50										// 最大配列数

// 内部変数 - テスト用
#ifdef D_TEST
	static int siRes;
	static FILE *szpFpT, *szpFpA;
#endif

// 実行メイン
int
fMain(
	int piTNo					// <I> テスト番号 1～
)
{
	int i;
	char lc1Buf[1024], lc1Out[1024];

	// テストファイルオープン
#ifdef D_TEST
	sprintf(lc1Buf, ".\\Test\\T%d.txt", piTNo);
	szpFpT = fopen(lc1Buf, "r");
	sprintf(lc1Buf, ".\\Test\\A%d.txt", piTNo);
	szpFpA = fopen(lc1Buf, "r");
	siRes = 0;
#endif

	// 配列数取得
	int liACnt;
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpT);
#else
	fgets(lc1Buf, sizeof(lc1Buf), stdin);
#endif
	sscanf(lc1Buf, "%d", &liACnt);

	// 配列・最大・最小取得
	int liHNo = 0;
	int liLNo = 0;
	int li1Array[D_ARRAY_MAX];
	for (i = 0; i < liACnt; i++) {
#ifdef D_TEST
		fscanf(szpFpT, " %d", &li1Array[i]);
#else
		fscanf(stdin, " %d", &li1Array[i]);
#endif

		// 最大更新
		if (li1Array[liHNo] < li1Array[i]) {
			liHNo = i;
		}

		// 最小更新
		if (li1Array[liLNo] > li1Array[i]) {
			liLNo = i;
		}
	}

	// 手順取得
	int li1FNo[D_ARRAY_MAX * 2];
	int li1TNo[D_ARRAY_MAX * 2];
	int liOCnt = 0;
	if (abs(li1Array[liHNo]) > abs(li1Array[liLNo])) {

		// 左側より小さい場合、加算
		for (i = 1; i < liACnt; i++) {
			while (li1Array[i] < li1Array[i - 1]) {
				li1Array[i] += li1Array[liHNo];
				li1FNo[liOCnt] = liHNo;
				li1TNo[liOCnt] = i;
				liOCnt++;

				// 最大更新
				if (li1Array[liHNo] <= li1Array[i]) {
					liHNo = i;
				}
			}
		}
	}
	else {

		// 右側より大きい場合、減算
		for (i = liACnt - 2; i >= 0; i--) {
			while (li1Array[i] > li1Array[i + 1]) {
				li1Array[i] += li1Array[liLNo];
				li1FNo[liOCnt] = liLNo;
				li1TNo[liOCnt] = i;
				liOCnt++;

				// 最小更新
				if (li1Array[liLNo] >= li1Array[i]) {
					liLNo = i;
				}
			}
		}
	}

	// 手順数表示
	sprintf(lc1Out, "%d\n", liOCnt);
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, lc1Out)) {
		siRes = -1;
	}
#else
	printf("%s", lc1Out);
#endif

	// 手順表示
	for (i = 0; i < liOCnt; i++) {
		sprintf(lc1Out, "%d %d\n", li1FNo[i] + 1, li1TNo[i] + 1);
#ifdef D_TEST
		fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
		if (strcmp(lc1Buf, lc1Out)) {
			siRes = -1;
		}
#else
		printf("%s", lc1Out);
#endif
	}

	// テストファイルクローズ
#ifdef D_TEST
	fclose(szpFpT);
	fclose(szpFpA);
#endif

	// テスト結果
#ifdef D_TEST
	if (siRes == 0) {
		printf("OK %d\n", piTNo);
	}
	else {
		printf("NG %d\n", piTNo);
	}
#endif

	return 0;
}

int
main()
{

#ifdef D_TEST
	int i;
	for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) {
		fMain(i);
	}
#else
	fMain(0);
#endif

	return 0;
}