#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include<vector>
#include<cstring>
#include<set>
#include <cstdio>
#include<queue>
#include<map>
#define WHITE 0
#define GRAY  1
#define BLACK 2
#define endl '\n'
#define forup(i,a,n) for( int i =a; i < n; i++)
#define llforup(i,a,n) for( ll i =a; i < n; i++)
#define fordown(i,a,n) for( int i =a; i >= n; i--)
#define fornot(i,a,n) for( int i=a;!n;i++)
#define mod  (ll)(1e9+7)
#define ifempty(a)  if(!a)
using namespace std;
typedef long long ll;
inline int readnum()
{
	int p, data = 0; char ch = 0;
	while ((ch != ' - ') && ch < '0' || ch>'9') ch = getchar();//相当于正则表达式的搜索，跳过不需要的字符
	if (ch == '- ')p = -1, ch = getchar();
	else p = 1;
	while (ch >= '0' && ch <= '9') data = data * 10 + ch - '0', ch = getchar();//搜索需要的字符
	return data * p;
}
inline int ReadPossitive()
{
	char ch; int data = 0;
	ch = getchar();
	while (ch == ' ' || ch == '\n')ch = getchar();
	while (ch != ' ' && ch != '\n' && ch != EOF)
	{
		data = data * 10 + ch - '0';
		ch = getchar();
	}
	return data;
}
//E-mail 374656045@qq.com
struct Queen { int col, Rdiag, Ldiag, available,cur; int vis = 0; };
Queen stack[8 + 5];//预留五个空位,stack里面存储对应的列数，
class solve
{
	//1.手写数组栈缓存结果才能进行输出
	//2.尝试迭代算法
private:
	ll full;
	int x, y;
	int N;
public:
	solve()
	{
		initial();
		dfs();
		print();
	}
	inline void initial()
	{
		full = (1 << 8) - 1;
		memset(stack, 0, 8 * sizeof(Queen));
		N = ReadPossitive();
		forup(i, 0, N)
		{
			x = ReadPossitive();
			y = ReadPossitive();
			stack[x].vis = 1<<y;//比布尔值存入更多的信息，注意棋盘是反的，序号从零开始，第八个数的序号是七
		}
	}
	void dfs()
	{
		int cnt = 0;
		//怎么知道是进行到第几行?需要什么参数？答：递归用栈进行模拟
		//递归的pos创建了副本又怎么实现？答：在栈中增加参数。
		//回溯条件是什么？是走到死路但是cnt!=8，注意每一层的available都在实时变化，要保存状态。
		//要输出方案，还要设置一个变量记录。
		//已经确保总有解，注意不用if(cnt==8)break
		//提供循环接口
		stack[cnt].available = full & ~(stack[cnt].col | stack[cnt].Rdiag | stack[cnt].Ldiag);//1表示可操作，available表示当前可操作的所有1;
		while (1)
		{
			while (stack[cnt].available)
			{
					stack[cnt].cur = (stack[cnt].available & -stack[cnt].available);//最右边的1
					if (stack[cnt].vis)//如果已经预先设定
					{
						if (!(stack[cnt].cur & stack[cnt].vis))//能放的位置是1,如果放的位置不对就尝试同层的其他棋子，while (cnt != 8)控制的才是层间切换
						{
							stack[cnt].available -= stack[cnt].cur;
							continue;
						}
					}
					if (cnt == 7)goto loop;//即使退出，防止还有解，九皇后,loop跳跃大法
					stack[cnt].available -= stack[cnt].cur;
					stack[cnt + 1].col = stack[cnt].col + stack[cnt].cur;
					stack[cnt + 1].Ldiag = (stack[cnt].Ldiag + stack[cnt].cur) << 1;
					stack[cnt + 1].Rdiag = (stack[cnt].Rdiag + stack[cnt].cur) >> 1;
					cnt++;
					stack[cnt].available = full & ~(stack[cnt].col | stack[cnt].Rdiag | stack[cnt].Ldiag);
				
			}
			cnt--;
		}
	loop: {}
	}
	void print()
	{
		forup(i, 0, 8)
		{
			forup(j, 0, 8)
			{
				if (stack[i].cur &1)printf("Q");
				else printf(".");
				stack[i].cur >>= 1;
			}
			printf("\n");
		}
	}
};
int main(void)
{
	ios_base::sync_with_stdio(0); cin.tie(0);//慎用，cin和scanf混用会导致非MSC++WA
#ifdef DEBUG
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif
	solve solution;
#ifdef DEBUG
	fclose(stdin);//关闭文件 
	fclose(stdout);//关闭文件 
#endif
	return 0;

}




Measured memory_bytes: 3120