#include <iostream>
#include <sstream>
#include <vector>
#include <utility>

typedef std::pair<int, int> point;
typedef std::vector<point> points;

std::istream& operator>>(std::istream &in, point &out)
{
    char ch1, ch2, ch3;
    if (in >> ch1 >> out.first >> ch2 >> out.second >> ch3)
    {
        if ((ch1 != '(') || (ch2 != ',') || (ch3 != ')')) 
            in.setstate(std::ios_base::failbit);
    }
    return in;
}

std::istream& operator>>(std::istream &in, points &out)
{
    point pt;
    char ch;

    if (!(in >> ch))
        return in;

    if (ch != '[')
    {
        in.setstate(std::ios_base::failbit);
        return in;
    }

    ch = in.peek();
    do
    {
        if (ch == std::istream::traits_type::eof())
        {
            in.setstate(std::ios_base::failbit);
            break;
        }

        if (ch == ']')
        {
            in.ignore(1);
            break;
        }

        if (ch != '(')
        {
            in.setstate(std::ios_base::failbit);
            break;
        }

        if (!(in >> pt))
            break;

        out.push_back(pt);

        ch = in.peek();
        if (ch == ',')
        {
            in.ignore(1);
            ch = in.peek();
       }
    }
    while (true);

    return in;
}

int main() {
	std::istringstream iss("[(1,2),(10,4),(5,12)]");
    points coords;
    iss >> coords;
    for(auto &pt: coords)
        std::cout << pt.first << ' ' << pt.second << std::endl;
	return 0;
}