Problem:
Score : 700 points

Problem Statement

You are given a string s of length n.
Does a tree with n vertices that satisfies the following conditions exist?

The vertices are numbered 1,2,..., n.

The edges are numbered 1,2,..., n-1, and Edge i connects Vertex u_i and v_i.

If the i-th character in s is 1, we can have a connected component of size i by removing one edge from the tree.

If the i-th character in s is 0, we cannot have a connected component of size i by removing any one edge from the tree.

If such a tree exists, construct one such tree.

Constraints

2 \leq n \leq 10^5

s is a string of length n consisting of 0 and 1.

Input

Input is given from Standard Input in the following format:

s

Output

If a tree with n vertices that satisfies the conditions does not exist, print -1.

If a tree with n vertices that satisfies the conditions exist, print n-1 lines.
The i-th line should contain u_i and v_i with a space in between.
If there are multiple trees that satisfy the conditions, any such tree will be accepted.

Sample Input 1

1111

Sample Output 1

-1

It is impossible to have a connected component of size n after removing one edge from a tree with n vertices.

Sample Input 2

1110

Sample Output 2

1 2
2 3
3 4

If Edge 1 or Edge 3 is removed, we will have a connected component of size 1 and another of size 3. If Edge 2 is removed, we will have two connected components, each of size 2.

Sample Input 3

1010

Sample Output 3

1 2
1 3
1 4

Removing any edge will result in a connected component of size 1 and another of size 3.

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Text;

class Solution
{
    static void Main(string[] args)
    {
        int[] s = Array.ConvertAll(Console.ReadLine().ToCharArray(), c => c - '0');

        bool ok = s[0] == 1 && s[s.Length - 1] == 0;
        for (int i = 0; i < s.Length - 1; i++)
        {
            if (s[i] != s[s.Length - 2 - i]) ok = false;
        }
        if (!ok)
        {
            Console.WriteLine(-1);
        }
        else
        {
            List<Edge> edges = new List<Edge>();
            Stack<int> children = new Stack<int>();
            for (int v = 1; v <= s.Length; v++)
            {
                if (s[v - 1] == 1 || v == s.Length)
                {
                    while (children.Count > 0)
                    {
                        edges.Add(new Edge(v, children.Pop()));
                    }
                }
                children.Push(v);
            }

            foreach (var e in edges)
            {
                Console.WriteLine($"{e.u} {e.v}");
            }
        }
    }
}

struct Edge
{
    public int u, v;
    public Edge(int u, int v)
    {
        this.u = u;
        this.v = v;
    }
}