思路: 三维树状数组
分析:
1 点击打开查看论文 建议先看看这篇论文,然后就懂了,裸的三维树状数组
代码:
/************************************************
* By: chenguolin *
* Date: 2013-08-21 *
* Address: http://blog.csdn.net/chenguolinblog *
***********************************************/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long int64;
const int MAXN = 1e2+10;
int n , m;
int64 treeNum[MAXN][MAXN][MAXN];
int lowbit(int x){
return x&(-x);
}
int64 getSum(int x , int y , int z){
int64 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 += treeNum[i][j][k];
return sum;
}
void add(int x , int y , int z , int val){
for(int i = x ; i < MAXN ; i += lowbit(i))
for(int j = y ; j < MAXN ; j += lowbit(j))
for(int k = z ; k < MAXN ; k += lowbit(k))
treeNum[i][j][k] += val;
}
void solve(){
memset(treeNum , 0 , sizeof(treeNum));
int mark;
int x1 , y1 , z1;
int x2 , y2 , z2;
while(m--){
scanf("%d" , &mark);
if(mark == 1){
scanf("%d%d%d" , &x1 , &y1 , &z1);
scanf("%d%d%d" , &x2 , &y2 , &z2);
x1++ , y1++ , z1++;
x2++ , y2++ , z2++;
// up
add(x1 , y1 , z1 , 1);
add(x1 , y2+1 , z1 , -1);
add(x2+1 , y1 , z1 , -1);
add(x2+1 , y2+1 , z1 , 1);
// down
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 , z2+1 , -1);
}
else{
scanf("%d%d%d" , &x1 , &y1 , &z1);
x1++ , y1++ , z1++;
int ans = getSum(x1 , y1 , z1)%2;
printf("%d\n" , ans);
}
}
}
int main(){
while(scanf("%d%d" , &n , &m) != EOF)
solve();
return 0;
}