#include <string>
#include <vector>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
int block[110][110][2];
int N;
int insert(int x, int y, int type)
{
// 기둥
if(type == 0)
{
// 기둥은 바닥 위에 있거나
if(y == 0)
{
return 1;
}
// 보의 한쪽 끝 부분 위에 있거나
else if((x-1 >= 0 && block[x-1][y][1] == 1) || block[x][y][1] == 1)
{
return 1;
}
// 또는 다른 기둥 위에 있어야 합니다.
else if(y-1 >= 0 && block[x][y-1][0] == 1)
{
return 1;
}
return 0;
}
// 보
else
{
// 보는 한쪽 끝 부분이 기둥 위에 있거나
if((y-1 >= 0 && block[x][y-1][0] == 1) || (x+1 <= N && y-1 >= 0 && block[x+1][y-1][0] == 1))
{
return 1;
}
// 또는 양쪽 끝 부분이 다른 보와 동시에 연결되어 있어야 합니다.
else if(x-1 >= 0 && x+1 <= N && block[x-1][y][1] == 1 && block[x+1][y][1] == 1)
{
return 1;
}
return 0;
}
}
int erase()
{
for(int i = 0; i <= N; i++)
{
for(int j = 0; j <= N; j++)
{
for(int k = 0; k < 2; k++)
{
if(block[i][j][k] == 1)
{
block[i][j][k] = 0;
if(insert(i, j, k) == 0)
{
block[i][j][k] = 1;
return 0;
}
block[i][j][k] = 1;
}
}
}
}
return 1;
}
vector<vector<int>> solution(int n, vector<vector<int>> build_frame)
{
vector<vector<int>> answer;
N = n;
for(int i = 0; i < build_frame.size(); i++)
{
int x = build_frame[i][0];
int y = build_frame[i][1];
// 기둥
if(build_frame[i][2] == 0)
{
// 설치
if(build_frame[i][3] == 1)
{
// 성공
if(insert(x, y, 0) == 1)
{
block[x][y][0] = 1;
}
}
// 삭제
else
{
block[x][y][0] = 0;
// 실패
if(erase() == 0)
{
block[x][y][0] = 1;
}
}
}
// 보
else if(build_frame[i][2] == 1)
{
// 설치
if(build_frame[i][3] == 1)
{
// 성공
if(insert(x, y, 1) == 1)
{
block[x][y][1] = 1;
}
}
// 삭제
else
{
block[x][y][1] = 0;
// 실패
if(erase() == 0)
{
block[x][y][1] = 1;
}
}
}
}
for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= n; j++)
{
for(int k = 0; k < 2; k++)
{
if(block[i][j][k] == 1)
{
vector<int> temp;
temp.push_back(i);
temp.push_back(j);
temp.push_back(k);
answer.push_back(temp);
}
}
}
}
return answer;
}