#include <cstdio>
#include <cctype>
inline int read (void) {
register int x = 0, f = 1, ch = getchar();
while(!isdigit(ch)) { if(ch == '-') f = -f; ch = getchar(); }
while(isdigit(ch)) { x = x * 10 + ch - '0'; ch = getchar(); }
return x * f;
}
const int maxn = 5e5;
struct node {
bool value[5][5];
node *left, *right;
}seg[maxn<<1], *root = seg;
int tot_seg;
bool x[2][maxn], y[maxn];
inline void update (node *p, int mid) {
register bool a = x[0][mid], b = x[1][mid];
for(register int i=0; i<4; ++i)
for(register int j=0; j<4; ++j)
p -> value[i][j] = i == j;
p -> value[0][1] = p -> value[1][0] =
p -> left -> value[0][1] ||
(p -> left -> value[0][3] && a && p -> right -> value[0][1] && b && p -> left -> value[2][1]);
p -> value[0][2] = p -> value[2][0] =
(p -> left -> value[0][3] && a && p -> right -> value[0][2]) ||
(p -> left -> value[0][2] && b && p -> right -> value[1][2]);
p -> value[0][3] = p -> value[3][0] =
(p -> left -> value[0][3] && a && p -> right -> value[0][3]) ||
(p -> left -> value[0][2] && b && p -> right -> value[1][3]);
p -> value[1][2] = p -> value[2][1] =
(p -> left -> value[1][2] && b && p -> right -> value[1][2]) ||
(p -> left -> value[1][3] && a && p -> right -> value[0][2]);
p -> value[1][3] = p -> value[3][1] =
(p -> left -> value[1][2] && b && p -> right -> value[1][3]) ||
(p -> left -> value[1][3] && a && p -> right -> value[0][3]);
p -> value[2][3] = p -> value[3][2] =
p -> right -> value[2][3] ||
(p -> right -> value[3][0] && a && p -> left -> value[3][2] && b && p -> right -> value[1][2]);
}
inline node update (node left, node right, int mid) {
register bool a = x[0][mid], b = x[1][mid];
node nw;
for(register int i=0; i<4; ++i)
for(register int j=0; j<4; ++j)
nw.value[i][j] = i == j;
nw.value[0][1] = nw.value[1][0] =
left.value[0][1] ||
(left.value[0][3] && a && right.value[0][1] && b && left.value[2][1]);
nw.value[0][2] = nw.value[2][0] =
(left.value[0][3] && a && right.value[0][2]) ||
(left.value[0][2] && b && right.value[1][2]);
nw.value[0][3] = nw.value[3][0] =
(left.value[0][3] && a && right.value[0][3]) ||
(left.value[0][2] && b && right.value[1][3]);
nw.value[1][2] = nw.value[2][1] =
(left.value[1][2] && b && right.value[1][2]) ||
(left.value[1][3] && a && right.value[0][2]);
nw.value[1][3] = nw.value[3][1] =
(left.value[1][2] && b && right.value[1][3]) ||
(left.value[1][3] && a && right.value[0][3]);
nw.value[2][3] = nw.value[3][2] =
right.value[2][3] ||
(right.value[3][0] && a && left.value[3][2] && b && right.value[1][2]);
return nw;
}
void build (int l, int r, node *p = root) {
if(l == r) {
for(register int i=0; i<4; ++i)
for(register int j=0; j<4; ++j)
p -> value[i][j] = (i == j) || (y[l]);
p -> value[0][3] = p -> value[3][0] = p -> value[1][2] = p -> value[2][1] = 1;
return ;
}
register int mid = (l + r) >> 1;
p -> left = seg + ++ tot_seg;
build (l, mid, p -> left);
p -> right = seg + ++tot_seg;
build (mid+1, r, p -> right);
update (p, mid);
}
void modify (int l, int r, int c, node *p = root) {
if(l == r) {
for(register int i=0; i<4; ++i)
for(register int j=0; j<4; ++j)
p -> value[i][j] = (i == j) || (y[l]);
p -> value[0][3] = p -> value[3][0] = p -> value[1][2] = p -> value[2][1] = 1;
return ;
}
register int mid = (l + r) >> 1;
if(c <= mid) modify (l, mid, c, p -> left);
else modify (mid+1, r, c, p -> right);
update (p, mid);
}
void modify1 (int l, int r, int c, node *p = root) {
if(l == r) {
for(register int i=0; i<4; ++i)
for(register int j=0; j<4; ++j)
p -> value[i][j] = (i == j) || (y[l]);
p -> value[0][3] = p -> value[3][0] = p -> value[1][2] = p -> value[2][1] = 1;
return ;
}
register int mid = (l + r) >> 1;
if(c < mid) modify (l, mid, c, p -> left);
else if(c > mid) modify (mid+1, r, c, p -> right);
update (p, mid);
}
node query (int l, int r, int ql, int qr, node *p = root) {
if(ql <= l && r <= qr) return *p;
register int mid = (l + r) >> 1;
if(ql <= mid)
if(mid < qr) {
node tpa = query (l, mid, ql, qr, p -> left);
node tpb = query (mid+1, r, ql, qr, p -> right);
return update (tpa, tpb, mid);
} else return query (l, mid, ql, qr, p -> left);
else return query (mid+1, r, ql, qr, p -> right);
}
char c[15];
int main (void) {
int n = read();
build (1, n);
while(1) {
scanf("%s", c+1);
if(c[1] == 'E') {
return 0;
} else if(c[1] == 'O') {
int r1, c1, r2, c2;
r1 = read(); c1 = read();
r2 = read(); c2 = read();
if(r1 == r2) {
if(c1 < c2) {
x[r1-1][c1] = 1;
modify1 (1, n, c1);
} else {
x[r1-1][c2] = 1;
modify1 (1, n, c2);
}
} else {
y[c1] = 1;
modify (1, n, c1);
}
} else if(c[1] == 'C') {
int r1, c1, r2, c2;
r1 = read(); c1 = read();
r2 = read(); c2 = read();
if(r1 == r2) {
if(c1 < c2) {
x[r1-1][c1] = 0;
modify1 (1, n, c1);
} else {
x[r1-1][c2] = 0;
modify1 (1, n, c2);
}
} else {
y[c1] = 0;
modify (1, n, c1);
}
} else if(c[1] == 'A') {
int r1, c1, r2, c2;
r1 = read(); c1 = read();
r2 = read(); c2 = read();
if(c1 > c2) {
c1 ^= c2 ^= c1 ^= c2;
r1 ^= r2 ^= r2 ^= r1;
}
node tp, tpl, tpr;
tp = query (1, n, c1, c2);
tpl = query (1, n, 1, c1);
tpr = query (1, n, c2, n);
bool flag = 0;
if(r1 == 1 && r2 == 1) {
flag = flag || tp.value[0][3];
flag = flag || (tpl.value[3][2] && tp.value[1][3]);
flag = flag || (tp.value[0][2] && tpr.value[1][0]);
flag = flag || (tpl.value[3][2] && tp.value[1][2] && tpr.value[1][0]);
} else if(r1 == 1 && r2 == 2) {
flag = flag || tp.value[0][2];
flag = flag || (tpl.value[3][2] && tp.value[1][2]);
flag = flag || (tp.value[0][3] && tpr.value[0][1]);
flag = flag || (tpl.value[3][2] && tp.value[1][3] && tpr.value[0][1]);
} else if(r1 == 2 && r2 == 1) {
flag = flag || tp.value[1][3];
flag = flag || (tpl.value[2][3] && tp.value[0][3]);
flag = flag || (tp.value[1][2] && tpr.value[1][0]);
flag = flag || (tpl.value[2][3] && tp.value[0][2] && tpr.value[1][0]);
} else if(r1 == 2 && r2 == 2) {
flag = flag || tp.value[1][2];
flag = flag || (tpl.value[2][3] && tp.value[0][2]);
flag = flag || (tp.value[1][3] && tpr.value[1][0]);
flag = flag || (tpl.value[2][3] && tp.value[0][3] && tpr.value[1][0]);
}
printf("%c\n", flag ? 'Y' : 'N' );
}
}
return 0;
}
@Rem°
@Irressey
@Terminus_Est
@HoneyLemon