这是一道三维树状数组,题目大意与解决方法与poj2155相同,就是把二维换成了三维,不会的可以先做下poj2155.
我的代码:
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#define maxn 110
using namespace std;
int tree[maxn][maxn][maxn],n,m;
int add(int x,int y,int z,int v){
for (int i=x;i<=n;i+=i&(-i))
for (int j=y;j<=n;j+=j&(-j))
for (int k=z;k<=n;k+=k&(-k))
tree[i][j][k]+=v;
return 0;
}
int sum(int x,int y,int z){
int ans=0;
for (int i=x;i>0;i-=i&(-i))
for (int j=y;j>0;j-=j&(-j))
for (int k=z;k>0;k-=k&(-k))
ans+=tree[i][j][k];
return ans;
}
int main (){
//freopen("test.in","r",stdin);
while (~scanf("%d%d",&n,&m)){
memset(tree,0,sizeof(tree));
for (int i=0;i<m;i++){
int op;scanf("%d",&op);
if (op==1){
int x1,x2,y1,y2,z1,z2;
scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
add(x2+1,y2+1,z2+1,1);
add(x2+1,y1,z2+1,1);
add(x1,y2+1,z2+1,1);
add(x2+1,y2+1,z1,1);
add(x2+1,y1,z1,1);
add(x1,y2+1,z1,1);
add(x1,y1,z2+1,1);
add(x1,y1,z1,1);
}
else {
int x,y,z;scanf("%d%d%d",&x,&y,&z);
printf("%d\n",sum(x,y,z)&1);
}
}
}
return 0;
}