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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define repl(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define repr(i,a,b) for(int i=(int)(a-1);i>=(int)(b);i--)
#define rep(i,n) repl(i,0,n)
#define each(itr,v) for(auto itr:v)
#define pb(s) push_back(s)
#define all(x) (x).begin(),(x).end()
#define dbg(x) cout << #x" = " << x << endl
#define maxch(x,y) x=max(x,y)
#define minch(x,y) x=min(x,y)
#define uni(x) x.erase(unique(all(x)),x.end())
#define exist(x,y) (find(all(x),y)!=x.end())
#define bcnt(x) bitset<32>(x).count()

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;

#define INF INT_MAX/3

ll a[51];

int main(){
  cin.sync_with_stdio(false);
  int n, mini = INF, maxi = -INF, p, q;
  cin >> n;
  rep(i, n) {
    cin >> a[i];
    if (mini > a[i]) mini = a[i], p = i;
    if (maxi < a[i]) maxi = a[i], q = i;
  }
  vector<P> ans;
  if (mini < 0 && maxi > 0) {
    if (abs(mini) > abs(maxi)) {
      rep(i, n) {
        if (i == p) continue;
        ans.pb(P(p + 1, i + 1));
        a[i] += mini;
      }
      maxi += mini;
    } else {
      rep(i, n) {
        if (i == q) continue;
        ans.pb(P(q + 1, i + 1));
        a[i] += maxi;
      }
      mini += maxi;
    }
  }
  if (maxi < 0) {
    repr(i, n, 1) if (a[i - 1] > a[i]) {
      ans.pb(P(i + 1, i));
      a[i - 1] += a[i];
    }
  } else {
    repl(i, 1, n) if (a[i - 1] > a[i]) {
      ans.pb(P(i, i + 1));
      a[i] += a[i - 1];
    }
  }
  cout << ans.size() << endl;
  rep(i, ans.size()) cout << ans[i].fi << " " << ans[i].se << endl;
  return 0;
}