#include <iostream>
#include <array>
#include <utility>
#include <set>
#include <map>
#include <queue>
struct Point
{
int x;
int y;
Point() : x(0), y(0) {}
Point(int x, int y) : x(x), y(y) {}
Point operator+(const Point& p) const
{
return Point(x + p.x, y + p.y);
}
bool operator<(const Point& p) const
{
if(p.x == x)
return p.y < y;
return p.x < x;
}
bool operator==(const Point& p) const
{
return p.x == x && p.y == y;
}
};
std::array<Point, 8> movements {
Point(-1,-2), Point(1,-2), Point(-1, 2), Point(1, 2),
Point(-2,-1), Point(2,-1), Point(-2, 1), Point(2, 1)
};
int main()
{
Point start;
Point destination;
std::cin >> destination.x >> destination.y;
std::map<std::pair<Point, Point>, int> dist;
std::queue<Point> queue;
std::set<Point> visited;
queue.push(start);
visited.insert(start);
while(!queue.empty())
{
auto current = queue.front();
if(current == destination)
break;
queue.pop();
for(auto& move: movements)
{
auto neighbor = current + move;
if(visited.find(neighbor) != visited.end())
continue;
visited.insert(neighbor);
queue.push(neighbor);
dist[std::make_pair(start, neighbor)] = dist[std::make_pair(start, current)] + 1;
}
}
std::cout << dist[std::make_pair(start, destination)] << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoJI2luY2x1ZGUgPGFycmF5PgoJI2luY2x1ZGUgPHV0aWxpdHk+CgkjaW5jbHVkZSA8c2V0PgoJI2luY2x1ZGUgPG1hcD4KCSNpbmNsdWRlIDxxdWV1ZT4KCglzdHJ1Y3QgUG9pbnQKCXsKCQlpbnQgeDsKCQlpbnQgeTsKCgkJUG9pbnQoKSA6IHgoMCksIHkoMCkge30KCQlQb2ludChpbnQgeCwgaW50IHkpIDogeCh4KSwgeSh5KSB7fQoJCVBvaW50IG9wZXJhdG9yKyhjb25zdCBQb2ludCYgcCkgY29uc3QKCQl7CgkJCXJldHVybiBQb2ludCh4ICsgcC54LCB5ICsgcC55KTsKCQl9CgoJCWJvb2wgb3BlcmF0b3I8KGNvbnN0IFBvaW50JiBwKSBjb25zdAoJCXsKCQkJaWYocC54ID09IHgpCgkJCQlyZXR1cm4gcC55IDwgeTsKCQkJcmV0dXJuIHAueCA8IHg7CgkJfQoKCQlib29sIG9wZXJhdG9yPT0oY29uc3QgUG9pbnQmIHApIGNvbnN0CgkJewoJCQlyZXR1cm4gcC54ID09IHggJiYgcC55ID09IHk7CgkJfQoJfTsKCglzdGQ6OmFycmF5PFBvaW50LCA4PiBtb3ZlbWVudHMgewoJCVBvaW50KC0xLC0yKSwgUG9pbnQoMSwtMiksIFBvaW50KC0xLCAyKSwgUG9pbnQoMSwgMiksCgkJUG9pbnQoLTIsLTEpLCBQb2ludCgyLC0xKSwgUG9pbnQoLTIsIDEpLCBQb2ludCgyLCAxKQoJfTsKCglpbnQgbWFpbigpCgl7CgkJUG9pbnQgc3RhcnQ7CgkJUG9pbnQgZGVzdGluYXRpb247CgkJc3RkOjpjaW4gPj4gZGVzdGluYXRpb24ueCA+PiBkZXN0aW5hdGlvbi55OwoJCXN0ZDo6bWFwPHN0ZDo6cGFpcjxQb2ludCwgUG9pbnQ+LCBpbnQ+IGRpc3Q7CgkJc3RkOjpxdWV1ZTxQb2ludD4gcXVldWU7CgkJc3RkOjpzZXQ8UG9pbnQ+IHZpc2l0ZWQ7CgoJCXF1ZXVlLnB1c2goc3RhcnQpOwoJCXZpc2l0ZWQuaW5zZXJ0KHN0YXJ0KTsKCQl3aGlsZSghcXVldWUuZW1wdHkoKSkKCQl7CgkJCWF1dG8gY3VycmVudCA9IHF1ZXVlLmZyb250KCk7CgkJCWlmKGN1cnJlbnQgPT0gZGVzdGluYXRpb24pCgkJCQlicmVhazsKCQkJcXVldWUucG9wKCk7CgoJCQlmb3IoYXV0byYgbW92ZTogbW92ZW1lbnRzKQoJCQl7CgkJCQlhdXRvIG5laWdoYm9yID0gY3VycmVudCArIG1vdmU7CgkJCQlpZih2aXNpdGVkLmZpbmQobmVpZ2hib3IpICE9IHZpc2l0ZWQuZW5kKCkpCgkJCQkJY29udGludWU7CgkJCQl2aXNpdGVkLmluc2VydChuZWlnaGJvcik7CgkJCQlxdWV1ZS5wdXNoKG5laWdoYm9yKTsKCQkJCWRpc3Rbc3RkOjptYWtlX3BhaXIoc3RhcnQsIG5laWdoYm9yKV0gPSBkaXN0W3N0ZDo6bWFrZV9wYWlyKHN0YXJ0LCBjdXJyZW50KV0gKyAxOwoJCQl9CgkJfQoJCXN0ZDo6Y291dCA8PCBkaXN0W3N0ZDo6bWFrZV9wYWlyKHN0YXJ0LCBkZXN0aW5hdGlvbildIDw8IHN0ZDo6ZW5kbDsKCX0=