题意:还是那篇论文里面讲到的,三维树状数组
http://wenku.baidu.com/view/1e51750abb68a98271fefaa8
画个立方体出来对照一下好想一点
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> a 10 #include<algorithm> 11 using namespace std; 12 13 typedef long long LL; 14 const int INF = (1<<30)-1; 15 const int mod=1000000007; 16 const int maxn=1000005; 17 const int N=105; 18 19 int n,m; 20 int a[155][155][155],c[155][155][155]; 21 22 int lowbit(int x){ return x & (-x);} 23 24 int sum(int x,int y,int z){ 25 int ret=0; 26 for(int i=x;i>0;i-=lowbit(i)) 27 for(int j=y;j>0;j-=lowbit(j)) 28 for(int k=z;k>0;k-=lowbit(k)) 29 ret+=c[i][j][k]; 30 31 return ret; 32 } 33 34 void add(int x,int y,int z,int d){ 35 for(int i=x;i<=N;i+=lowbit(i)) 36 for(int j=y;j<=N;j+=lowbit(j)) 37 for(int k=z;k<=N;k+=lowbit(k)) 38 c[i][j][k] += d; 39 } 40 41 42 43 int main(){ 44 while(scanf("%d %d",&n,&m) != EOF){ 45 memset(c,0,sizeof(c)); 46 while(m--){ 47 int cmd; 48 scanf("%d",&cmd); 49 if(cmd == 1){ 50 int x1,y1,z1,x2,y2,z2; 51 scanf("%d %d %d %d %d %d",&x1,&y1,&z1,&x2,&y2,&z2); 52 x1++;y1++;z1++; 53 x2++;y2++;z2++; 54 add(x1,y1,z1,1); 55 add(x2+1,y1,z1,-1); 56 add(x1,y2+1,z1,-1); 57 add(x2+1,y2+1,z1,1); 58 59 add(x1,y1,z2+1,-1); 60 add(x2+1,y1,z2+1,1); 61 add(x1,y2+1,z2+1,1); 62 add(x2+1,y2+1,z2+1,-1); 63 } 64 else{ 65 int x,y,z; 66 scanf("%d %d %d",&x,&y,&z); 67 x++;y++;z++; 68 printf("%d\n",sum(x,y,z) % 2); 69 } 70 } 71 } 72 return 0; 73 }