use std::io;
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read input");
let startdata: Vec<usize> = input.split_ascii_whitespace().map(|e| e.parse::<usize>().unwrap()).collect();
if startdata[2] == 1 {
let mut color: usize = 0;
let mut onerowvector: Vec<usize> = vec!();
let mut onecolvector: Vec<usize> = vec!();
for step in 1..(startdata[3]+1) {
let mut stepinput = String::new();
io::stdin().read_line(&mut stepinput).expect("Failed to read input");
let stepdata = parse_input(&stepinput);
if stepdata.2 {
if !onerowvector.contains(&stepdata.0) {
color += startdata[1];
color -= onecolvector.len();
onerowvector.push(stepdata.0);
}
} else {
if !onecolvector.contains(&stepdata.0) {
color += startdata[0];
color -= onerowvector.len();
onecolvector.push(stepdata.0);
}
}
}
} else {
let mut colors: Vec<usize> = vec!();
for color in 0..startdata[2] {
colors.push(0);
}
let mut rowvector: Vec<(usize, usize, usize)> = vec!();
let mut colvector: Vec<(usize, usize, usize)> = vec!();
for step in 1..(startdata[3]+1) {
let mut stepinput = String::new();
io::stdin().read_line(&mut stepinput).expect("Failed to read input");
let stepdata = parse_input(&stepinput);
if stepdata.2 {
let mut targetstep = 0;
let mut targetcolor = startdata[2];
colors[stepdata.1] += startdata[1];
rowvector.push((stepdata.0, stepdata.1, step));
for rownum in (0..(rowvector.len()-1)).rev() {
if rowvector[rownum].0 == stepdata.0 {
targetcolor = rowvector[rownum].1;
targetstep = rowvector[rownum].2;
rowvector[rownum].2 = 0;
break;
}
} for col in colvector.iter().rev() { if col.2 != 0 { if col.2 < targetstep { break;
} else {
colors[col.1] -= 1;
if targetcolor != startdata[2] {
colors[targetcolor] += 1;
}
}
}
}
if targetcolor != startdata[2] {
colors[targetcolor] -= startdata[1];
}
} else {
let mut targetstep = 0;
let mut targetcolor = startdata[2];
colors[stepdata.1] += startdata[0];
colvector.push((stepdata.0, stepdata.1, step));
for colnum in (0..(colvector.len()-1)).rev() {
if colvector[colnum].0 == stepdata.0 {
targetcolor = colvector[colnum].1;
targetstep = colvector[colnum].2;
colvector[colnum].2 = 0;
break;
}
} for row in rowvector.iter().rev() { if row.2 != 0 { if row.2 < targetstep { break;
} else {
colors[row.1] -= 1;
if targetcolor != startdata[2] {
colors[targetcolor] += 1;
}
}
}
}
if targetcolor != startdata[2] {
colors[targetcolor] -= startdata[0];
}
}
}
}
for color in colors {
println!("{}", color);
}
}
pub fn parse_input(input: &String) -> (usize, usize, bool) {
let datavector: Vec<&str> = input.split_ascii_whitespace().collect();
let command = match datavector[0] {
"R" => true,
"C" => false,
_ => false,
};
let index = datavector[1].parse::<usize>().unwrap();
let color = datavector[2].parse::<usize>().unwrap();
return (index-1, color-1, command);
}