#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <string>
#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>

using namespace std;

void SolveA()
{
	string s;
	cin >> s;

	const char *ss = s.c_str();

	int bee = 0;
	for (int i = 0; i < s.length(); i++)
	{
		if (ss[i] == '1')
		{
			bee++;
		}
	}
	printf("%d\n", bee);
}

void SolveB()
{
	int n;
	scanf("%d", &n);

	vector<int> A;
	for (int i = 0; i < n; i++)
	{
		int tmp;
		scanf("%d", &tmp);
		A.push_back(tmp);
	}

	int counter = 0;
	bool flagLoop = true;
	while (flagLoop)
	{
		bool flagAllEven = true;
		for (int i = 0; i < n; i++)
		{
			if (A[i] % 2 != 0)
			{
				flagAllEven = false;
				flagLoop = false;
			}
		}
		if (flagAllEven == true)
		{
			for (int i = 0; i < n; i++)
			{
				A[i] /= 2;
			}
			counter++;
		}
	}

	printf("%d\n", counter);
}

// 公式の解説版
void AtCoderSolveB()
{
	// 個数の入力
	int N;
	scanf("%d", &N);

	// 番犬かつ答えを保持する変数
	int dmin = INT_MAX;

	for (int i = 0; i < N; i++)
	{
		// 要素の入力
		int A;
		scanf("%d", &A);
		
		// 2で割る操作を行った回数
		int d = 0;

		// 要素が偶数の間
		while (A % 2 == 0)
		{
			// 要素を2で割る
			A /= 2;
			// 割った回数を保持する
			d++;
		}

		// 割った回数の最小を保持する
		dmin = min(dmin, d);
	}

	// 結果出力
	printf("%d\n", dmin);
}

//bool vector_finder(std::vector<int> vec, int number) {
//	auto itr = std::find(vec.begin(), vec.end(), number);
//	size_t index = std::distance(vec.begin(), itr);
//	if (index != vec.size()) { // 発見できたとき
//		return true;
//	}
//	else { // 発見できなかったとき
//		return false;
//	}
//}

void SolveC()
{
	int N, K;
	scanf("%d %d", &N, &K);

	//int *numKind = new int[N]();
	vector<int> numKind;
	numKind.resize(N + 1, 0);
	int clock = 0;
	vector<int> kind;
	
	for (int i = 1; i < N + 1; i++)
	{
		int tmp;
		scanf("%d", &tmp);
		//if (vector_finder(kind, tmp))
		//{
		//	numKind[tmp]++;
		//}
		//else
		//{
		//	kind.push_back(tmp);
		//	numKind[tmp]++;
		//	clock++;
		//}
		if (std::find(kind.begin(), kind.end(), tmp) != kind.end())
		{
			numKind[tmp]++;
		}
		else
		{
			kind.push_back(tmp);
			numKind[tmp]++;
			clock++;
		}
	}

	if (clock <= K)
	{
		printf("0\n");
		return;
	}

	int cntChange = 0;
	while (clock > K)
	{
		int minIdx = kind[0];
		for (int i = 0; i < kind.size(); i++)
		{
			if (numKind[minIdx] == 0)
			{
				minIdx = kind[i];
			}
			else
			{
				if (numKind[kind[i]] < numKind[minIdx])
				{
					minIdx = kind[i];
				}
			}
		}
		while (numKind[minIdx] > 0)
		{
			numKind[minIdx]--;
			cntChange++;
		}
		clock--;
	}

	printf("%d\n", cntChange);
}

void AtCoderSolveC()
{
	// 個数, 種類制限数の入力
	int N, K;
	scanf("%d %d", &N, &K);

	// 要素数のカウントするvector
	vector<int> counter;
	// 0(1) ~ Nを0に初期化(1 ~ Nの範囲にしたほうがわかりやすいと思ったので)
	counter.resize(N + 1, 0);
	// 要素
	for (int i = 1; i <= N; i++)
	{
		int tmp;
		scanf("%d", &tmp);
		counter[tmp]++;
	}

	// 降順にソートする
	sort(counter.rbegin(), counter.rend());

	// 数値を変更しなくていいボールの総数を求める
	int sumKeep = 0;
	for (int i = 0; i < K; i++)
	{
		sumKeep += counter[i];
	}

	// 書き換える必要がある回数(書き換えるボールの個数)
	int ans = N - sumKeep;

	printf("%d\n", ans);
}

void SolveD()
{
	// 個数の入力
	int N;
	scanf("%d", &N);

	// 要素の入力
	vector<int> a;
	for (int i = 0; i < N; i++)
	{
		int tmp;
		scanf("%d", &tmp);
		a.push_back(tmp);
	}

	// 操作回数
	int m = 0;
	// 操作した時のX, Yの値を保持(問題は1-index, ソースコード上では0-index)
	vector<int> swapX;
	vector<int> swapY;
	
	//// swap
	//for (int i = 1; i < N; i++)
	//{
	//	// 一つ前の値　が　現在の値　より大きい時
	//	if (a[i - 1] > a[i])
	//	{
	//		for (int j = 0; j < N; j++)
	//		{
	//			int present = a[i] + a[j];
	//			if (i + 1 == N)
	//			{
	//				if (a[i - 1] <= present)
	//				{
	//					a[i] = present;
	//					m++;
	//					swapX.push_back(i + 1);
	//					swapY.push_back(j + 1);
	//					break;
	//				}
	//				else if (a[i] < present)
	//				{
	//					a[i] = present;
	//					m++;
	//					swapX.push_back(i + 1);
	//					swapY.push_back(j + 1);
	//					continue;
	//				}
	//			}
	//			else if (a[i - 1] <= present <= a[i + 1])
	//			{
	//				a[i] = present;
	//				m++;
	//				swapX.push_back(i + 1);
	//				swapY.push_back(j + 1);
	//				break;
	//			}
	//			else if (a[i] < present)
	//			{
	//				a[i] = present;
	//				m++;
	//				swapX.push_back(i + 1);
	//				swapY.push_back(j + 1);
	//				continue;
	//			}
	//		}
	//	}
	//}

	for (int i = 0; i < N; i++)
	{
		if (i == N - 1)
		{

		}
		else
		{
			// 現在の値　が　一つ先の値　より大きい時
			if (a[i] > a[i + 1])
			{
				// a[i]が負の値の時
				if (a[i] < 0)
				{
					for (int j = 0; j < N; j++)
					{
						int present = a[i] + a[j];
						if (i + 1 == N)
						{
							if (a[i - 1] <= present)
							{
								a[i] = present;
								m++;
								swapX.push_back(i + 1);
								swapY.push_back(j + 1);
								break;
							}
							else if (a[i] < present)
							{
								a[i] = present;
								m++;
								swapX.push_back(i + 1);
								swapY.push_back(j + 1);
								continue;
							}
						}
						else if (a[i - 1] <= present <= a[i + 1])
						{
							a[i] = present;
							m++;
							swapX.push_back(i + 1);
							swapY.push_back(j + 1);
							break;
						}
						else if (a[i] < present)
						{
							a[i] = present;
							m++;
							swapX.push_back(i + 1);
							swapY.push_back(j + 1);
							continue;
						}
							}
				}
				else
				{

				}
			}
		}
	}

	printf("%d\n", m);
	for (int i = 0; i < m; i++)
	{
		printf("%d %d\n", swapY[i], swapX[i]);
	}

}

void AtCoderSolveD()
{
	// 要素数の入力
	int N;
	scanf("%d", &N);

	// MIN(最小の要素)のインデックス
	int minAIdx = 1;
	// MAX(最大の要素)のインデックス
	int maxAIdx = 1;

	// 要素の入力
	vector<int> A;
	A.resize(N + 1);
	for (int i = 1; i <= N; i++)
	{
		scanf("%d", &A[i]);
		// 最小の要素を見つける
		if (A[i] < A[minAIdx])
		{
			minAIdx = i;
		}
		// 最大の要素を見つける
		if (A[i] > A[maxAIdx])
		{
			maxAIdx = i;
		}
	}

	// 入れ替えの回数を表示(今回は必ず2 * N - 1)になる
	// 理由は下記のループ回数を見よ
	printf("%d\n", 2 * N - 1);

	// |MAX| > |MIN|
	// MAXの絶対値がMINの絶対値より大きいということは
	// 全ての値にMAXを足すと，必ず全ての要素が正の数となる
	if (abs(A[maxAIdx]) >= abs(A[minAIdx]))
	{
		// 全ての要素にMAXを足す
		// ->すべての要素が正の数に
		for (int i = 1; i <= N; i++)
		{
			printf("%d %d\n", maxAIdx, i);
		}
		// 現在の要素 = 現在の要素 + ひとつ下の要素
		// を行うと必ず 現在の要素 > ひとつ下の要素 になる
		for (int i = 2; i <= N; i++)
		{
			printf("%d %d\n", i - 1, i);
		}
	}
	// |MIN| > |MAX|
	// MINの絶対値がMAXの絶対値より大きいということは
	// 全ての値にMINを足すと，必ず全ての要素が0以下の数字となる
	else
	{
		// 全ての要素にMINを足す
		// ->全ての要素が0以下の整数に
		for (int i = 1; i <= N; i++)
		{
			printf("%d %d\n", minAIdx, i);
		}
		// 一つ上の要素 = 一つ上の要素 + 現在の要素
		// を行うと必ず 現在の要素 < 一つ上の要素 になる
		for (int i = N - 1; i >= 1; i--)
		{
			printf("%d %d\n", i + 1, i);
		}
	}
}

int main()
{
	//SolveA();
	//SolveB();
	//SolveC(); // ✕
	//SolveD();


	//AtCoderSolveB();
	//AtCoderSolveC();
	AtCoderSolveD();
}



Measured memory_bytes: 256