fn getline() -> String{ let mut __ret=String::new(); std::io::stdin().read_line(&mut __ret).ok(); return __ret; } fn main() { let n=getline(); let n:Vec<_>=n.trim().split(' ').collect(); let n:i32=n[0].parse().unwrap(); let r=getline(); let r:Vec<_>=r.trim().split(' ').collect(); let r:Vec=r.iter().map(|v| v.parse().unwrap()).collect(); let g=getline(); let g:Vec<_>=g.trim().split(' ').collect(); let g:Vec=g.iter().map(|v| v.parse().unwrap()).collect(); let b=getline(); let b:Vec<_>=b.trim().split(' ').collect(); let b:Vec=b.iter().map(|v| v.parse().unwrap()).collect(); let mut gb: Vec<_> = Vec::new(); let mut mgb: Vec<_> = Vec::new(); let mut ans:i32=0; let split_num:i32 = (n + (1000 - 1)) / 1000; for k1 in 0..split_num { gb.clear(); mgb.clear(); for k2 in 0..split_num { for i in 1000 * k1..std::cmp::min(n,1000 * (k1 + 1)) { for j in 1000 * k2..std::cmp::min(n,1000 * (k2 + 1)) { let l = g[i as usize] + b[j as usize]; gb.push(l); let m = std::cmp::max(g[i as usize],b[j as usize]); mgb.push(m); } } } for i in 0..n { for l in 0..gb.len() { if (r[i as usize] < gb[l as usize]) & (r[i as usize] >= mgb[l as usize]) { ans = ans +1; } } } } println!("{}",ans) }