Problem:
Score : 200 points

Problem Statement

There is a kangaroo at coordinate 0 on an infinite number line that runs from left to right, at time 0.
During the period between time i-1 and time i, the kangaroo can either stay at his position, or perform a jump of length exactly i to the left or to the right.
That is, if his coordinate at time i-1 is x, he can be at coordinate x-i, x or x+i at time i.
The kangaroo's nest is at coordinate X, and he wants to travel to coordinate X as fast as possible.
Find the earliest possible time to reach coordinate X.

Constraints

X is an integer.

1≤X≤10^9

Input

The input is given from Standard Input in the following format:

X

Output

Print the earliest possible time for the kangaroo to reach coordinate X.

Sample Input 1

6

Sample Output 1

3

The kangaroo can reach his nest at time 3 by jumping to the right three times, which is the earliest possible time.

Sample Input 2

2

Sample Output 2

2

He can reach his nest at time 2 by staying at his position during the first second, and jumping to the right at the next second.

Sample Input 3

11

Sample Output 3

5

Solution in Rust (1.15.1) (judge verdict: Accepted)

use std::io::{BufRead, Error, ErrorKind, Read};
use std::str::FromStr;

pub struct Scanner<'a, R>
where
    R: 'a + BufRead + ?Sized,
{
    reader: &'a mut R,
}

impl<'a, R> Scanner<'a, R>
where
    R: 'a + BufRead + ?Sized,
{
    pub fn new(reader: &'a mut R) -> Self {
        Scanner { reader: reader }
    }

    pub fn next_byte(&mut self) -> Result<u8, Error> {
        self.reader
            .bytes()
            .skip_while(|ref c| !Self::is_printable(*c.as_ref().ok().unwrap()))
            .next()
            .unwrap()
    }

    pub fn next_bytes(&mut self) -> Result<Vec<u8>, Error> {
        self.reader
            .bytes()
            .skip_while(|ref c| !Self::is_printable(*c.as_ref().ok().unwrap()))
            .take_while(|ref c| Self::is_printable(*c.as_ref().ok().unwrap()))
            .collect()
    }

    pub fn next_unsigned(&mut self) -> Result<u64, Error> {
        self.reader
            .bytes()
            .skip_while(|ref c| !Self::is_printable(*c.as_ref().ok().unwrap()))
            .take_while(|ref c| Self::is_printable(*c.as_ref().ok().unwrap()))
            .fold(Ok(0), |s, x| {
                s.and_then(|t| {
                    x.and_then(|y| {
                        if b'0' <= y && y <= b'9' {
                            Ok(t * 10 + (y - b'0') as u64)
                        } else {
                            Err(Error::new(ErrorKind::InvalidData, "found not a digit"))
                        }
                    })
                })
            })
    }

    pub fn next_signed(&mut self) -> Result<i64, Error> {
        self.reader
            .bytes()
            .skip_while(|ref c| !Self::is_printable(*c.as_ref().ok().unwrap()))
            .take_while(|ref c| Self::is_printable(*c.as_ref().ok().unwrap()))
            .fold(Ok([0i64, 0]), |s, x| {
                x.and_then(|y| {
                    s.and_then(|t| {
                        if t[0] == 0 && y == b'-' {
                            Ok([-1, 0])
                        } else if b'0' <= y && y <= b'9' {
                            Ok([
                                if t[0] == 0 { 1 } else { t[0] },
                                t[1] * 10 + (y - b'0') as i64,
                            ])
                        } else {
                            Err(Error::new(ErrorKind::InvalidData, "found not a digit"))
                        }
                    })
                })
            })
            .and_then(|s| Ok(s[0] * s[1]))
    }

    pub fn next_float(&mut self) -> Result<f64, Error> {
        self.reader
            .bytes()
            .skip_while(|ref c| !Self::is_printable(*c.as_ref().ok().unwrap()))
            .take_while(|ref c| Self::is_printable(*c.as_ref().ok().unwrap()))
            .collect::<Result<Vec<u8>, Error>>()
            .and_then(|t| {
                String::from_utf8(t).or(Err(Error::new(ErrorKind::InvalidData, "invalid data")))
            })
            .and_then(|s| {
                f64::from_str(&s).or(Err(Error::new(ErrorKind::InvalidData, "invalid data")))
            })
    }

    fn is_printable(c: u8) -> bool {
        0x21 <= c && c <= 0x7e
    }
}

fn main() {
    let stdin = std::io::stdin();
    let mut locked = stdin.lock();
    let mut scanner = Scanner::new(&mut locked);

    let x = scanner.next_unsigned().unwrap();
    let (mut lb, mut ub) = (0, 100000);

    while ub - lb > 1 {
        let md = (lb + ub) / 2;
        let y = md * (md + 1) / 2;
        if y >= x {
            ub = md;
        } else {
            lb = md;
        }
    }

    println!("{}", ub);
}