Problem:
Integral Rectangles

Let us consider rectangles whose height, h, and
width, w, are both integers. We call such rectangles
integral rectangles. In this problem, we consider only wide
integral rectangles, i.e., those with w > h.

We define the following ordering of wide integral rectangles. Given
two wide integral rectangles,

The one shorter in its diagonal line is smaller, and

If the two have diagonal lines with the same length, the one shorter
in its height is smaller.

Given a wide integral rectangle, find the smallest wide integral
rectangle bigger than the given one.

Input

The entire input consists of multiple datasets. The number of
datasets is no more than 100. Each dataset describes a wide integral
rectangle by specifying its height and width, namely h
and w, separated by a space in a line, as follows.

h w

For each dataset, h and w (>h) are both
integers greater than 0 and no more than 100.

The end of the input is indicated by a line of two zeros separated by a space.

Output

For each dataset, print in a line two numbers describing the
height and width, namely h and w (> h), of the
smallest wide integral rectangle bigger than the one described in the
dataset. Put a space between the numbers. No other
characters are allowed in the output.

For any wide integral rectangle given in the input, the width and
height of the smallest wide integral rectangle bigger than the given
one are both known to be not greater than 150.

In addition, although
the ordering of wide integral rectangles uses the comparison of
lengths of diagonal lines, this comparison can be replaced with that
of squares (self-products) of lengths of diagonal lines, which can
avoid unnecessary troubles possibly caused by the use of floating-point
numbers.

Sample Input

1 2
1 3
2 3
1 4
2 4
5 6
1 8
4 7
98 100
99 100
0 0

Output for the Sample Input

1 3
2 3
1 4
2 4
3 4
1 8
4 7
2 8
3 140
89 109

Solution in C++14 (judge verdict: Accepted)

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

struct Rect {
    int h, w, d;
    Rect(int _h, int _w) : h(_h), w(_w) {
        d = _h * _h + _w * _w;
    }
    bool operator>(const Rect y) const {
        return (this->d > y.d) || (!(this->d > y.d) && (this->h > y.h));
    }
    bool operator<(const Rect y) const {
        return (this->d < y.d) || (!(this->d < y.d) && (this->h < y.h));
    }
};

int main() {
    vector<Rect> List;
    for (int h = 1; h <= 150; ++h) {
        for (int w = h + 1; w <= 150; ++w) {
            List.push_back(Rect(h, w));
        }
    }
    sort(List.begin(), List.end());

    /*
    for (auto &p : List) {
        cout << p.h << " " << p.w << " " << p.d << endl;
    }
    */

    while (true) {
        int h, w;
        cin >> h >> w;
        if (h == 0) break;

        for (int i = 0; i < List.size(); ++i) {
            if (h == List[i].h && w == List[i].w) {
                cout << List[i + 1].h << " " << List[i + 1].w << endl;
                break;
            }
        }
    }

    return 0;
}