AtCoder Beginner Contest 349 D

https://atcoder.jp/contests/abc349/tasks/abc349_d

Rを超えないようにできるだけ飛べばよいです。

// Divide Interval
#![allow(non_snake_case)]


//////////////////// library ////////////////////

fn read<T: std::str::FromStr>() -> T {
    let mut line = String::new();
    std::io::stdin().read_line(&mut line).ok();
    line.trim().parse().ok().unwrap()
}

fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    read::<String>().split_whitespace()
            .map(|e| e.parse().ok().unwrap()).collect()
}


//////////////////// process ////////////////////

fn read_input() -> (u64, u64) {
    let v = read_vec();
    let (L, R) = (v[0], v[1]);
    (L, R)
}

fn print_intervals(intervals: Vec<(u64, u64)>) {
    println!("{}", intervals.len());
    for (l, r) in intervals.into_iter() {
        println!("{} {}", l, r)
    }
}

fn next(l: u64, R: u64) -> u64 {
    let mut d: u64 = 1;
    loop {
        if l + d > R {
            d >>= 1;
            break
        }
        else if l % d != 0 {
            d >>= 1;
            break
        }
        else {
            d <<= 1
        }
    }
    l + d
}

fn F(L: u64, R: u64) -> Vec<(u64, u64)> {
    let mut intervals: Vec<(u64, u64)> = vec![];
    let mut l = L;
    while l < R {
        let r = next(l, R);
        intervals.push((l, r));
        l = r
    }
    intervals
}

fn main() {
    let (L, R) = read_input();
    let intervals = F(L, R);
    print_intervals(intervals)
}