代码:
#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define ls x<<1
#define rs x<<1|1
int n;
bool rev[N][2];
struct node{
bool l,r,u,d,p,q;
int lb,rb;
}t[4*N];
void pushup(node &x,node l,node r){
x.lb=l.lb;x.rb=r.rb;
x.l=l.l|(l.u&rev[l.rb][0]&r.l&rev[l.rb][1]&l.d);
x.r=r.r|(r.u&rev[l.rb][0]&l.r&rev[l.rb][1]&r.d);
x.u=(l.u&rev[l.rb][0]&r.u)|(l.p&rev[l.rb][1]&r.q);
x.d=(l.d&rev[l.rb][1]&r.d)|(l.q&rev[l.rb][0]&r.p);
x.p=(l.p&rev[l.rb][1]&r.d)|(r.p&rev[l.rb][0]&l.u);
x.q=(l.q&rev[l.rb][0]&r.u)|(r.q&rev[l.rb][1]&l.d);
}
void build(int x,int l,int r){
if(l==r){
t[x].u=t[x].d=1;
t[x].lb=t[x].rb=l;
return;
}
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(t[x],t[ls],t[rs]);
}
void update1(int x,int l,int r,int p,int row,int val){
int mid=l+r>>1;
if(mid==p){
rev[p][row]=val;
pushup(t[x],t[ls],t[rs]);
return;
}
if(p<=mid)update1(ls,l,mid,p,row,val);
else update1(rs,mid+1,r,p,row,val);
pushup(t[x],t[ls],t[rs]);
}
void update2(int x,int l,int r,int p,int val){
if(l==r){
t[x].l=t[x].r=t[x].p=t[x].q=val;
return;
}
int mid=l+r>>1;
if(p<=mid)update2(ls,l,mid,p,val);
else update2(rs,mid+1,r,p,val);
pushup(t[x],t[ls],t[rs]);
}
node query(int x,int l,int r,int xl,int xr){
node ans;
if(l==xl&&r==xr){
return t[x];
}
int mid=l+r>>1;
if(xr<=mid)return query(ls,l,mid,xl,xr);
else if(xl>mid)return query(rs,mid+1,r,xl,xr);
pushup(ans,query(ls,l,mid,xl,xr),query(rs,mid+1,r,xl,xr));
return ans;
}
int main(){
scanf("%d",&n);char s[10];
build(1,1,n);
while(~scanf("%s",s)&&s[0]!='E'){
if(s[0]=='O'){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a==c)update1(1,1,n,min(b,d),a-1,1);
else update2(1,1,n,b,1);
}
if(s[0]=='C'){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a==c)update1(1,1,n,min(b,d),a-1,0);
else update2(1,1,n,b,0);
}
if(s[0]=='A'){
int a,b,c,d;bool flag=0;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(b>d)swap(a,c),swap(b,d);
node ans1=query(1,1,n,b,d),ans2=query(1,1,n,1,b),ans3=query(1,1,n,d,n);
if(a==1){
if(c==1)flag=(ans1.u|(ans2.r&ans1.d&ans3.l));
else flag=((ans2.r&ans1.d)|(ans3.l&ans1.u)|ans1.p);
}
else{
if(c==1)flag=((ans2.r&ans1.u)|(ans3.l&ans1.d)|ans1.q);
else flag=((ans2.r&ans1.u&ans3.l)|ans1.d);
}
printf(flag?"Y\n":"N\n");
}
}
}