由二维的推一下就好了
注意一下三维空间的容斥性,更新的时候
注意一下这是区间更新,单点查询
仔细想一想为什么可以这么做
Add(x1, y1, z1, 1);
Add(x2+1, y1, z1, -1);
Add(x1, y2+1, z1, -1);
Add(x1, y1, z2+1, -1);
Add(x1, y2+1, z2+1, 1);
Add(x2+1, y1, z2+1, 1);
Add(x2+1, y2+1, z1, 1);
Add(x2+1, y2+1, z2+1, -1);
#include <cstdio>
#include <cstring>
const int MAXN = 100 + 3;
int tree[MAXN][MAXN][MAXN];
int n;
inline int lowbit(int x)
{
return x & (-x);
}
void update(int x, int y, int z, int c)
{
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] += c;
}
}
}
}
int getsum(int x, int y, int z)
{
int sum = 0;
for(int i = x; i >= 1; i -= lowbit(i))
{
for(int j = y; j >= 1; j -= lowbit(j))
{
for(int k = z; k >= 1; k -= lowbit(k))
{
sum += tree[i][j][k];
}
}
}
return sum;
}
int main()
{
int m;
while(scanf("%d%d", &n, &m) != EOF)
{
memset(tree, 0, sizeof(tree));
int x1, y1, z1, x2, y2, z2, q;
while(m--)
{
scanf("%d", &q);
if(q)
{
scanf("%d%d%d%d%d%d", &x1, &y1, &z1, &x2, &y2, &z2);
update(x1, y1, z1, 1);//更新这个点到n的矩阵
update(x2 + 1, y1, z1, 1);
update(x1, y2 + 1, z1, 1);
update(x1, y1, z2 + 1, 1);
update(x2 + 1, y2 + 1, z1, 1);
update(x2 + 1, y1, z2 + 1, 1);
update(x1, y2 + 1, z2 + 1, 1);
update(x2 + 1, y2 + 1, z2 + 1, 1);
}
else
{
scanf("%d%d%d", &x1, &y1, &z1);
int t = getsum(x1, y1, z1);
if(t & 1) puts("1");
else puts("0");
}
}
}
return 0;
}