http://acm.hdu.edu.cn/showproblem.php?pid=3584

裸三维树状数组。。。除了三维的容斥要稍微想一下别的都和一维、二维的一样了

View Code
#include <iostream>
using namespace std;
const int MAX=101;
int n;
int tree[MAX][MAX][MAX];
int lowbit(int i){
    return i&(-i);
}
void update(int x,int y,int z)
{
    for(int i=x;i<=n;i+=lowbit(i))
        for(int j=y;j<=n;j+=lowbit(j))
            for(int k=z;k<=n;k+=lowbit(k))
                tree[i][j][k]^=1;
}
int Sum(int x,int y,int z)
{
    int sum=0;
    for(int i=x;i>0;i-=lowbit(i))
        for(int j=y;j>0;j-=lowbit(j))
            for(int k=z;k>0;k-=lowbit(k))
                sum+=tree[i][j][k];
    return sum;
}
int main()
{
    int m;
    while(~scanf("%d%d",&n,&m))
    {
        memset(tree,0,sizeof(tree));
        while(m--)
        {
            int op;
            scanf("%d",&op);
            int x1,y1,z1,x2,y2,z2;
            if(op)
            {
                scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
                update(x1,y1,z1);
                update(x2+1,y2+1,z2+1);
                update(x1,y1,z2+1);
                update(x2+1,y1,z1);
                update(x1,y2+1,z1);
                update(x1,y2+1,z2+1);
                update(x2+1,y1,z2+1);  
                update(x2+1,y2+1,z1);
            }
            else
            {
                scanf("%d%d%d",&x1,&y1,&z1);
                printf("%d\n",Sum(x1,y1,z1)&1);
            }
        }
    }
    return 0;
}