#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio();
cin.tie(nullptr);
int n, m, k, x, y, arvo, pienempi;
cin >> n >> m >> k;
pienempi = min(n, m);
if (k == 0)
{
cout << 0;
return 0;
}
int arvot[n][m];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
arvot[i][j] = 0;
}
}
int arvoYhteensa = 0;
string kala;
bool rapuja = false; // MUUTA SAKISDKFAISIFpHI
bool onkoHauki;
if (true)
for (int i = 0; i < k; i++)
{
cin >> y >> x;
x--;
y--;
cin >> kala;
onkoHauki = kala[0] == 'H';
if (!onkoHauki)
rapuja = true;
arvo = onkoHauki ? 1 : -10;
arvot[y][x] = arvo;
arvoYhteensa += arvo;
}
if (!rapuja)
{
if (k == n * m)
{
cout << arvoYhteensa - 1;
}
else
{
cout << arvoYhteensa;
}
return 0;
}
if (pienempi == 1)
{
if (n == 1 && m == 1)
{
cout << 0;
}
else
{
cout << arvoYhteensa + 10;
}
return 0;
}
int alas = (n - 1) / 2;
int vinoja = m + alas;
int summatVaaka[n][m];
int summatAlas[n][m];
int summatYlos[n][m];
int summa;
for (int y = 0; y < n; y++)
{
summa = 0;
for (int x = 0; x < m; x++)
{
summa += arvot[y][x];
summatVaaka[y][x] = summa;
}
}
int alku = 2 * alas;
int raja = 0;
int uusiX;
for (int x = 0; x < vinoja; x++)
{
summa = 0;
alku = min(n - 1, 2 * x);
raja = max(0, (x - m) * 2 + 1);
uusiX = max(0, x - alas - ((n + 1) & 1));
for (int y = alku; y >= raja; y--)
{
summa += arvot[y][uusiX];
summatYlos[y][uusiX] = summa;
uusiX += y & 1;
}
}
raja = n;
for (int x = 0; x <= vinoja; x++)
{
summa = 0;
alku = max(0, (n - 2 * x - 2 + (n & 1)));
raja = min(n - 1, n - (x - m +1) * 2 );
uusiX = max(0, x - alas);
for (int y = alku; y <= raja; y++)
{
//cout << uusiX << ", " << y << "\n";
summa += arvot[y][uusiX];
summatAlas[y][uusiX] = summa;
uusiX += y & 1;
}
}
if (!(n & 1))
{
summatYlos[n - 1][m - 1] = arvot[n - 1][m - 1];
summa = arvot[0][m - 1];
summatAlas[0][m - 1] = summa;
summa += arvot[1][m - 1];
summatAlas[1][m - 1] = summa;
}
int minimi = -10;
int nykyinenArvo;
int alkuarvo;
int kokoM1;
int huipunXkorjaus;
for (int y = 0; y < n - 1; y++)
{
alkuarvo = arvot[y][0];
kokoM1 = 0;
for (int koko = 2; koko <= n - y && koko <= m; koko++)
{
kokoM1++;
huipunXkorjaus = (koko - 1 + (y & 1)) >> 1;
if (y + koko < n)
{
int oikeaX = koko == 2 ? 0 : (koko - 2 + (y & 1)) >> 1;
alkuarvo += summatYlos[y][kokoM1] - summatYlos[y + koko][oikeaX];
}
else
alkuarvo += summatYlos[y][kokoM1];
nykyinenArvo = alkuarvo;
//cout << nykyinenArvo << "\n";
if (nykyinenArvo < minimi)
{
minimi = nykyinenArvo;
}
raja = m - koko;
for (int x = 1; x <= raja; x++)
{
nykyinenArvo += summatYlos[y][kokoM1 + x] - summatAlas[y + kokoM1][huipunXkorjaus + x - 1];
if (y > 0 && (x > 1 || (y & 1)))
nykyinenArvo += summatAlas[y - 1][x - 1 - ((y + 1) & 1)];
if (y + koko < n)
nykyinenArvo -= summatYlos[y + koko][huipunXkorjaus + x - ((y + koko) & 1)];
//cout << nykyinenArvo << "\n";
if (nykyinenArvo < minimi)
{
minimi = nykyinenArvo;
}
}
}
}
for (int y = n - 1; y > 0; y--)
{
alkuarvo = arvot[y][0];
kokoM1 = 0;
for (int koko = 2; y - koko >= -1 && koko <= m; koko++)
{
kokoM1++;
huipunXkorjaus = (koko - 1 + (y & 1)) >> 1; // optimoi
if (y - koko >= 0)
{
int oikeaX = koko == 2 ? 0 : (koko - 2 + (y & 1)) >> 1;
alkuarvo += summatAlas[y][kokoM1] - summatAlas[y - koko][oikeaX];
}
else
alkuarvo += summatAlas[y][kokoM1];
nykyinenArvo = alkuarvo;
//cout << nykyinenArvo << "\n";
if (nykyinenArvo < minimi)
{
minimi = nykyinenArvo;
}
raja = m - koko;
for (int x = 1; x <= raja; x++)
{
nykyinenArvo += summatAlas[y][kokoM1 + x];
if (y - koko > 0)
{
nykyinenArvo -= summatAlas[y - koko][huipunXkorjaus + x - ((y + koko) & 1)];
}
nykyinenArvo -= summatYlos[y - kokoM1][huipunXkorjaus + x - 1];
if (y < n - 1 && (x > 1 || (y & 1)))
{
nykyinenArvo += summatYlos[y + 1][x - 1 - ((y + 1) & 1)];
}
// cout << nykyinenArvo << "\n";
if (nykyinenArvo < minimi)
{
minimi = nykyinenArvo;
}
}
}
}
cout << arvoYhteensa - minimi;
}