2019-2020 ICPC, Asia Jakarta Regional Contest C. Even Path

题意:给你一个 n * n 的网格,每一行有一个价值ai,每一列有个价值bi,每个格子的价值就是该行的价值和该列的价值之和
q次询问,问你两点间,有没有存在一条路径,路过的格子全是偶数

一开始没想出来为什么行列要分开给,考虑到前缀和了没错但是一直在考虑二维前缀和,,
题目把格子拆成行,列给你肯定是要行列分别考虑,,,然后就是巧妙地01前缀和
int n,q;
int a[MAXN],b[MAXN],r[MAXN],c[MAXN];
int main()
{
    rd(n),rd(q);
    for(int i=1;i<=n;++i)//行
    {
        rd(a[i]);a[i]&=1;
        r[i]=r[i-1]+a[i];
    }
    for(int i=1;i<=n;++i)//列
    {
        rd(b[i]);b[i]&=1;
        c[i]=c[i-1]+b[i];
    }
    while(q--)
    {
        int x1,x2,y1,y2;
        rd(x1),rd(y1),rd(x2),rd(y2);//输入保证两格子价值都为偶数
        //行列价值和为偶数,则坐标为(偶,偶)//(奇,奇)
        //要继续走只能下一个坐标也为(偶,偶)//(奇,奇)
        //比如该行为(偶,偶),若想往右走,(此时下一列的行价值肯定为偶)
        //下一列的价值只能为偶,一次则每一列都应为偶数
        //奇数偶数用01表示//
        //利用前缀和就可以判断该行是否全为列/全为偶
        if(x1>x2) swap(x1,x2);
        if(y1>y2) swap(y1,y2);
        if ((a[x1] && r[x2] - r[x1 - 1] != x2 - x1 + 1)||(!a[x1] && r[x2] - r[x1 - 1] != 0)) puts("NO");
        else if ((b[y1] && c[y2] - c[y1 - 1] != y2 - y1 + 1)||(!b[y2] && c[y2] - c[y1 - 1] != 0)) puts("NO");
        else puts("YES");
    }
    //stop;
    return 0;
}