Subtask#1的点WA,一直调不出来求助QwQ
#include <bits/stdc++.h>
#define lson p<<1, l, mid
#define rson p<<1|1, mid+1, r
using namespace std;
const int N = 1e5+5;
struct Node{int lb, rb, l, r, u, d, p, q;}a[N<<2];
int n, g[3][N];
void pushup(Node &p, Node ls, Node rs) {
p.lb = ls.lb, p.rb = rs.rb;
p.l = ls.l || (ls.u && g[1][ls.rb] && rs.l && g[2][ls.rb] && ls.d);
p.r = rs.r || (rs.u && g[1][ls.rb] && ls.r && g[2][ls.rb] && rs.d);
p.u = (ls.u && g[1][ls.rb] && rs.u) || (ls.p && g[2][ls.rb] && rs.q);
p.d = (ls.d && g[2][ls.rb] && rs.d) || (ls.q && g[1][ls.rb] && rs.p);
p.p = (ls.u && g[1][ls.rb] && rs.p) || (ls.p && g[2][ls.rb] && rs.d);
p.q = (ls.d && g[2][ls.rb] && rs.q) || (ls.q && g[1][ls.rb] && rs.u);
}
void build(int p, int l, int r) {
if (l == r) {a[p] = {l, l, 0, 0, 1, 1, 0, 0}; return;}
int mid = l + r >> 1;
build(lson), build(rson);
pushup(a[p], a[p<<1], a[p<<1|1]);
}
void updatex(int p, int l, int r, int posx, int posy, int val) {
if (l == r) {g[posx][posy] = val; return;}
int mid = l + r >> 1;
if (mid >= posy) updatex(lson, posx, posy, val);
if (mid < posy) updatex(rson, posx, posy, val);
pushup(a[p], a[p<<1], a[p<<1|1]);
}
void updatey(int p, int l, int r, int posy, int val) {
if (l == r) {a[p].l = a[p].r = a[p].p = a[p].q = val; return;}
int mid = l + r >> 1;
if (mid >= posy) updatey(lson, posy, val);
if (mid < posy) updatey(rson, posy, val);
pushup(a[p], a[p<<1], a[p<<1|1]);
}
Node query(int p, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return a[p];
int mid = l + r >> 1;
if (mid >= qr) return query(lson, ql, qr);
if (mid < ql) return query(rson, ql, qr);
Node ans; pushup(ans, query(lson, ql, qr), query(rson, ql, qr));
return ans;
}
int main() {
cin >> n;
build(1, 1, n);
while (1) {
string op; int x1, y1, x2, y2;
cin >> op; if (op == "Exit") break;
cin >> x1 >> y1 >> x2 >> y2;
if (op == "Close")
if (y1 == y2) updatey(1, 1, n, y1, 0);
else updatex(1, 1, n, x1, min(y1, y2), 0);
if (op == "Open")
if (y1 == y2) updatey(1, 1, n, y1, 1);
else updatex(1, 1, n, x1, min(y1, y2), 1);
if (op == "Ask") {
if (y1 > y2) swap(x1, x2), swap(y1, y2);
Node resp = query(1, 1, n, 1, y1);
Node resm = query(1, 1, n, y1, y2);
Node resl = query(1, 1, n, y2, n);
bool ans = 0;
if (x1 == 1 && x2 == 1) {
if (resm.u) ans = 1;
if (resp.r && resm.d && resl.l) ans = 1;
}
if (x1 == 2 && x2 == 2) {
if (resm.d) ans = 1;
if (resp.r && resm.u && resl.l) ans = 1;
}
if (x1 == 1 && x2 == 2) {
if (resm.p) ans = 1;
if (resp.r && resm.d) ans = 1;
if (resl.l && resm.u) ans = 1;
}
if (x1 == 2 && x2 == 1) {
if (resm.q) ans = 1;
if (resp.r && resm.u) ans = 1;
if (resl.l && resm.d) ans = 1;
}
cout << (ans ? "Y" : "N") << endl;
}
}
return 0;
}