macro_rules! input {
    (source = $s:expr, $($r:tt)*) => {
        let mut iter = $s.split_whitespace();
        let mut next = || { iter.next().unwrap() };
        input_inner!{next, $($r)*}
    };
    ($($r:tt)*) => {
        let stdin = std::io::stdin();
        let mut bytes = std::io::Read::bytes(std::io::BufReader::new(stdin.lock()));
        let mut next = move || -> String{
            bytes
                .by_ref()
                .map(|r|r.unwrap() as char)
                .skip_while(|c|c.is_whitespace())
                .take_while(|c|!c.is_whitespace())
                .collect()
        };
        input_inner!{next, $($r)*}
    };
}
 
macro_rules! input_inner {
    ($next:expr) => {};
    ($next:expr, ) => {};
 
    ($next:expr, $var:ident : $t:tt $($r:tt)*) => {
        let $var = read_value!($next, $t);
        input_inner!{$next $($r)*}
    };
}
 
macro_rules! read_value {
    ($next:expr, ( $($t:tt),* )) => {
        ( $(read_value!($next, $t)),* )
    };
 
    ($next:expr, [ $t:tt ; $len:expr ]) => {
        (0..$len).map(|_| read_value!($next, $t)).collect::<Vec<_>>()
    };
 
    ($next:expr, chars) => {
        read_value!($next, String).chars().collect::<Vec<char>>()
    };
 
    ($next:expr, usize1) => {
        read_value!($next, usize) - 1
    };
 
    ($next:expr, $t:ty) => {
        $next().parse::<$t>().expect("Parse error")
    };
}

fn main() {
/*ABC109_A
    let ab=read_a();
    let a:i64=ab[0];
    let b:i64=ab[1];
    let mut j=false;
    for c in 1..4{
        if a*b*(c as i64)%2==1{j=true;}
    }
    if j{println!("Yes")} else {println!("No")};
*/

//use std::collections::BTreeSet;
/*ABC109_B
    let n=read_n();
    let mut w:Vec<Vec<char>>=vec!();
    for _ in 0..n{w.push(read_s())};
    //println!("{},{:?}", n,w);
    let mut j=true;
    if w.iter().collect::<BTreeSet<_>>().len() !=n{j=false};
    for i in 0..n-1{
        if w[i][w[i].len()-1]!=w[i+1][0]{j=false};
    }
    if j{println!("Yes");} else {println!("No");}
*/

//fn abs(a:i64)->i64{if a>0{a} else {-a}}
/*ABC109_C
    let nx:Vec<i64>=read_a();
    let n=nx[0] as usize;
    let x=nx[1];
    let mut a:Vec<i64>=read_a();
    let mut b:Vec<i64>=vec!();
    for i in 0..n{
        b.push(a[i as usize]-x);
    }
    fn gcd(a: i64, b: i64) -> i64 {
        if b == 0 {a} else {gcd(b, a % b)}
    }
    let mut ans=b[0];
    for i in 0..n{ans=gcd(ans,b[i]);}
    fn abs(a:i64)->i64{if a>0{a} else {-a}}
    ans=abs(ans);
    println!("{}",ans);
*/
/*ABC109_D
    input!{
        h: usize,
        w: usize,
        a: [[i32; w]; h],
    }
    let mut a=a;
    let mut n:usize=0;
    let mut ans=vec![];
    for i in 0..h{
        for j in 0..w{
            if j+1<w{
                if a[i][j]%2==1{
                    n+=1; a[i][j]-=1;a[i][j+1]+=1; ans.push((i+1,j+1,i+1,j+2));
                }
            }else if i+1<h{
                if a[i][j]%2==1{
                    n+=1; a[i][j]-=1;a[i+1][j]+=1; ans.push((i+1,j+1,i+2,j+1));
                }
            }
        }
    }
    println!("{}", n);
    for (x1,y1,x2,y2) in ans{
        println!("{} {} {} {}", x1,y1,x2,y2);
    }
*/

/*ABC108_A
    input!{
        k:usize,
    }
    let ans = {
        if k%2==0{k*k/4}else{k/2*(k-k/2)}
    };
    println!("{}",ans);
*/
/*ABC108_B
    input!{
        xy:[i32;4]
    }
    let x1=xy[0];
    let y1=xy[1];
    let x2=xy[2];
    let y2=xy[3];
    let x3=x2-y2+y1;
    let y3=y2+x2-x1;
    let x4=x1-y2+y1;
    let y4=y1+x2-x1;
    println!("{} {} {} {}", x3,y3,x4,y4);
*/
/*ABC107
    input!{
        ni:[i32;2],
    }
    let n=ni[0];let i=ni[1];
    println!("{}",n-i+1);
*/
/*ABC106
*/
    input!{
        ab:[i32;2]
    }
    println!("{}",(ab[0]-1)*(ab[1]-1));















}

Measured memory_bytes: 4352