#![allow(unused_imports)] use std::cmp::*; use std::collections::*; use std::io::Write; use std::ops::Bound::*; #[allow(unused_macros)] macro_rules! debug { ($($e:expr),*) => { #[cfg(debug_assertions)] $({ let (e, mut err) = (stringify!($e), std::io::stderr()); writeln!(err, "{} = {:?}", e, $e).unwrap() })* }; } fn main() { let n = read::(); let p = read_vec::(); println!("{}", count_inversion(&p)); } fn count_inversion(v: &Vec) -> i64 { let mut ans = 0; let mut bt = BinaryIndexTree::new(v.len()); for i in 0..v.len() { ans += i as i64 - bt.sum(v[i]); bt.add(v[i], 1); } ans } fn argsort(v: &Vec) -> Vec { let mut sort_v = Vec::new(); for i in 0..v.len() { sort_v.push((v[i], i)); } sort_v.sort(); sort_v.iter().map(|x| x.1).collect::>() } struct BinaryIndexTree { bit: Vec, n: usize, } impl BinaryIndexTree { fn new(n: usize) -> BinaryIndexTree { BinaryIndexTree { bit: vec![0; n + 1], n: n, } } fn sum(&self, i: usize) -> i64 { let mut i = i; let mut s = 0i64; while i > 0 { s += self.bit[i]; i -= (i as i64 & -(i as i64)) as usize; } s } fn add(&mut self, i: usize, x: i64) { let mut i = i; while i <= self.n { self.bit[i as usize] += x; i += (i as i64 & -(i as i64)) as usize; } } } fn read() -> T { let mut s = String::new(); std::io::stdin().read_line(&mut s).ok(); s.trim().parse().ok().unwrap() } fn read_vec() -> Vec { read::() .split_whitespace() .map(|e| e.parse().ok().unwrap()) .collect() }