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 Rust (1.15.1) (judge verdict: Accepted)

#[allow(unused_macros)]
macro_rules! parse_line {
    ( $t:ty ) => (
        {
            let mut line = String::new();
            ::std::io::stdin().read_line(&mut line).unwrap();
            let mut iter = line.split_whitespace();
            iter.next().unwrap().parse::<$t>().unwrap()
        }
    );

    ( $( $t:ty), +) => (
        {
            let mut line = String::new();
            ::std::io::stdin().read_line(&mut line).unwrap();
            let mut iter = line.split_whitespace();
            ( $(iter.next().unwrap().parse::<$t>().unwrap()),* )
        }
    );
}

#[allow(unused_macros)]
macro_rules! read_line {
    () => (
        {
            let mut line = String::new();
            ::std::io::stdin().read_line(&mut line).unwrap();
            line.pop();
            line
        }
    )
}

#[allow(unused_macros)]
macro_rules! parse_vec {
    ( $t:ty ) => (
        {
            let mut line = String::new();
            ::std::io::stdin().read_line(&mut line).unwrap();
            let iter = line.split_whitespace();
            iter.map(|v| v.parse::<$t>().unwrap()).collect::<Vec<_>>()
        }
    )
}

fn solve(mut aa: Vec<i32>) -> Vec<(usize, usize)> {
    let aa2 = aa.clone();
    aa.sort();
    let n = aa.len();

    if aa[0] >= 0 {
        (1..n).map(|i| (i, i+1)).collect::<Vec<_>>()
    } else if aa[n-1] <= 0 {
        (2..(n+1)).rev().map(|i| (i, i-1)).collect::<Vec<_>>()
    } else {
        if aa[0].abs() <= aa[n-1].abs() {
            let max_pos = aa2.iter().position(|&x| x == aa[n-1]).unwrap();
            let mut ret = (1..(n+1)).map(|i| (max_pos+1, i)).collect::<Vec<_>>();
            ret.extend((1..n).map(|i| (i, i+1)).collect::<Vec<_>>());
            ret

        } else {
            let min_pos = aa2.iter().position(|&x| x == aa[0]).unwrap();
            let mut ret = (1..(n+1)).map(|i| (min_pos+1, i)).collect::<Vec<_>>();
            ret.extend((2..n+1).rev().map(|i| (i, i-1)).collect::<Vec<_>>());
            ret
        }
    }
}

fn main() {
    read_line!();

    let aa = parse_vec!(i32);

    let ans = solve(aa);
    println!("{}", ans.len());

    for (x,y) in ans {
        println!("{} {}", x, y);
    }
}

#[test]
fn solve_test() {
    assert_eq!(solve(vec![-2,5,-1]), vec![(2,1),(2,2),(2,3),(1,2),(2,3)]);
    assert_eq!(solve(vec![-1,-3]), vec![(2,1)]);
    assert_eq!(solve(vec![0,0,0,0,0]), vec![(1,2),(2,3),(3,4),(4,5)]);
}