//注意输出格式
#include <iostream>
#include <vector>
#include <string>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#define maxn 100010
using namespace std;
void process(int n,int problemnumber)
{
//先对每个点是否存在先左或向下的边做标记
vector<vector<vector<bool>>> s;
vector<bool> temp1={0,0};
vector<vector<bool>> temp2;
for(int j=0;j<n+1;j++)
{
temp2.push_back(temp1);
}
for(int i=0;i<n+1;i++)
{
s.push_back(temp2);
}
int counts;
cin>>counts;
char direct;
int x,y;
while(counts--)
{
cin>>direct>>x>>y;
if(direct=='H')
s[x][y][0]=1;
else if(direct=='V')
s[y][x][1]=1;
}
//统计从这点开始向左和向下的最大边长
vector<vector<vector<int>>> s2;
vector<int> temp3={0,0};
vector<vector<int>> temp4;
for(int j=0;j<n+1;j++)
{
temp4.push_back(temp3);
}
for(int i=0;i<n+1;i++)
{
s2.push_back(temp4);
}
//向右最大边长
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int maxOfRight=0;
int k=j;
while(k!=(n+1)&&s[i][k][0]==1)//一定要先判断,不然s[i][k]会执行N+1!
] {
maxOfRight++;
k++;
}
s2[i][j][0]=maxOfRight;
}
//向下最大边长
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int maxofleft=0;
int k=i;
while(k!=(n+1)&&s[k][j][1]==1)
{
maxofleft++;
k++;
}
s2[i][j][1]=maxofleft;
}
int numberofsquare[9]={0,0,0,0,0,0,0,0,0};//0位不要,1--8对应大小为1--8的正方体个数
for(int i=1;i<=(n-1);i++)
for(int j=1;j<=(n-1);j++)
{
for(int k=1;k<=min(n-i,n-j);k++)//k为正方形边长,可能范围是(1,min(n-j,n-i))
{
if(s2[i][j][0]>=k&&s2[i][j][1]>=k)
{
if(s2[i+k][j][0]>=k&&s2[i][j+k][1]>=k)
{
numberofsquare[k]++;
}
}
}
}
cout<<"Problem #"<<problemnumber<<endl<<endl;
int tag=0;
for(int i=1;i<9;i++)
{
if(numberofsquare[i]!=0)
{
cout<<numberofsquare[i]<<" square (s) of size "<<i<<endl;
tag=1;
}
}
if(tag==0)
cout<<"No completed squares can be found."<<endl;
}
int main()
{
int n;
int problemNumber=1;
bool first=1;
while(cin>>n)
{
if(first==0)
cout<<endl<<"**********************************"<<endl<<endl;
process(n,problemNumber);
problemNumber++;
first=0;
}
}