use std::{io, str::SplitAsciiWhitespace};
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read input");
let mut substringiter = input.split_ascii_whitespace();
let height = parse(&mut substringiter);
let width = parse(&mut substringiter);
let mut grid: Vec<String> = vec!();
for _rownum in 0..height {
grid.push(".".repeat(width));
}
let pointamount = parse(&mut substringiter);
let mut previouspoint = (0, 0);
let mut firstpoint = (0, 0);
let mut point = (0,0);
for index in 0..(pointamount+1) {
if index != pointamount {
point = get_point();
} else {
point = firstpoint;
}
grid[point.0].replace_range((point.1)..(point.1+1), "*");
if index != 0 {
let dy = (point.0 as isize)-(previouspoint.0 as isize);
let dx = (point.1 as isize)-(previouspoint.1 as isize);
if dx == 0 {
let range1 = match point.0 > previouspoint.0 {
true => (previouspoint.0+1)..point.0,
false => (point.0+1)..previouspoint.0,
};
for rownum in range1 {
grid[rownum].replace_range((point.1)..(point.1+1), "|");
}
} else if dy == 0 {
let range = match point.1 > previouspoint.1 {
true => (previouspoint.1+1)..(point.1),
false => (point.1+1)..(previouspoint.1),
};
grid[point.0].replace_range(range, "=".repeat(dx.abs() as usize - 1).as_str());
} else {
let kulmakerroin = dy/dx;
if kulmakerroin == 1 {
let rangey = match point.0 > previouspoint.0 {
true => (previouspoint.0+1)..point.0,
false => (point.0+1)..previouspoint.0,
};
for rownum in rangey {
let x = previouspoint.1+1+(rownum-previouspoint.0)*(kulmakerroin as usize);
grid[rownum].replace_range((x-1)..x, (92 as char).to_string().as_str())
}
} else {
let rangey = match point.0 > previouspoint.0 {
true => (previouspoint.0+1)..point.0,
false => (point.0+1)..previouspoint.0,
};
for rownum in rangey {
let x = previouspoint.1+1-(rownum-previouspoint.0);
grid[rownum].replace_range((x-1)..x, "/");
}
}
}
} else {
firstpoint = point;
}
previouspoint = point;
}
for rownum in 0..height {
println!("{}", grid[rownum]);
}
}
pub fn parse(iter: &mut SplitAsciiWhitespace) -> usize {
let s = match iter.next() {
Some(s) => s.parse().unwrap(),
None => 0,
};
return s;
}
pub fn get_point() -> (usize, usize) {
let mut point = String::new();
io::stdin().read_line(&mut point).expect("Failed to read input");
let mut pointiter = point.split_ascii_whitespace();
let y = parse(&mut pointiter)-1;
let x = parse(&mut pointiter)-1;
let output = (y, x);
return output;
}