Problem:
Problem B: U&U

Problem

$2$つのチーム、チームUKUとチームうしがある。最初、チームUKUには$N$人、チームうしには$M$人の人がいる。
チームUKUとチームうしは「U&U」というゲームを行うことにした。「U&U」は$2$つのチームで共通のスコアを持っており、互いに協力しあい共通のスコアを最小化することが目的である。「U&U」は最初、すべての人の体力が$2$で、共通のスコアは$0$の状態で以下のような手順で進められる。

チームUKUの人は1人ずつ、チームうしの誰か$1$人に対してちょうど$1$回の攻撃を行う。
攻撃を受けた人は体力が$1$減り、体力が$0$になった場合そのチームから抜ける。
このときチームうしの人数が$0$人になったら、ゲームを終了する。
チームUKUのすべての人がちょうど$1$回の攻撃を終えた時点でゲームが終了してなければ共通のスコアに$1$が加算され、$2$.に進む

同様に、チームうしの人が$1$人ずつ、チームUKUの誰か$1$人に対してちょうど$1$回の攻撃を行う。
攻撃を受けた人は体力が$1$減り、体力が$0$になった場合そのチームから抜ける。
このときチームUKUの人数が$0$人になったら、ゲームを終了する。
チームうしのすべての人がちょうど$1$回の攻撃を終えた時点でゲームが終了してなければ共通のスコアに$1$が加算され、$1$.に戻る

チームUKUの人数とチームうしの人数が与えられたとき、「U&U」ゲーム終了時の共通のスコアとしてありえるものの最小値をもとめよ。

Input

入力は以下の形式で与えられる。

$N$ $M$

チームUKUの人数を表す整数$N$とチームうしの人数を表す整数$M$が空白区切りで与えられる。

Constraints

入力は以下の条件を満たす。

$1 \le N, M \le 10^{18}$

$N$と$M$は整数

Output

最小のスコアを$1$行に出力せよ。

Sample Input 1

20 10

Sample Output 1

0

Sample Input 2

10 20

Sample Output 2

1

Sample Input 3

64783 68943

Sample Output 3

4

Sample Input 4

1000000000000000000 1000000000000000000

Sample Output 4

2

Solution in Scala (judge verdict: Accepted)

object Main extends App {

  import scala.io.StdIn._
  import scala.math._

  val Array(uku, usi) = readLine.trim.split(' ').map(_.toLong)
  println(math.min(killUkuFirst(uku, usi), killUsiFirst(uku, usi)))
  def killUsiFirst(uku: Long, usi: Long): Int = {
    val ukuT = new Team(uku)
    val usiT = new Team(usi)
    var count = 0
    while (ukuT.isAlive && usiT.isAlive){
      usiT.decrease(ukuT.maxVote)
      if (usiT.isAlive){
        ukuT.decrease(usiT.minVote)
        count += 1
        if (ukuT.isAlive) count += 1
      }
    }
    count
  }
  def killUkuFirst(uku: Long, usi: Long): Int = {
    val ukuT = new Team(uku)
    val usiT = new Team(usi)
    var count = 0
    while (ukuT.isAlive && usiT.isAlive){
      usiT.decrease(ukuT.minVote)
      if (usiT.isAlive){
        ukuT.decrease(usiT.maxVote)
        count += 1
        if (ukuT.isAlive) count += 1
      }
    }
    count
  }
  class Team(private val start: Long) {
    private var health: Long = start * 2
    def decrease(vote: Long): Unit = {
      health -= vote
    }
    def maxVote: Long = math.min(start, health)
    def minVote: Long = (health + 1) / 2
    def isAlive: Boolean = health > 0
  }
  implicit class Extension[T](val value :T){
    def also(func: T ⇒ Unit): T = {
      func(value)
      value
    }
    def let[R](func: T ⇒ R): R = func(value)
  }
}