Given an N*N*N cube A, whose elements are either 0 or 1. A[i, j, k] means the number in the i-th row , j-th column and k-th layer. Initially we have A[i, j, k] = 0 (1 <= i, j, k <= N).
We define two operations, 1: “Not” operation that we change the A[i, j, k]=!A[i, j, k]. that means we change A[i, j, k] from 0->1,or 1->0. (x1<=i<=x2,y1<=j<=y2,z1<=k<=z2).
0: “Query” operation we want to get the value of A[i, j, k].
Input
Multi-cases.
First line contains N and M, M lines follow indicating the operation below.
Each operation contains an X, the type of operation. 1: “Not” operation and 0: “Query” operation.
If X is 1, following x1, y1, z1, x2, y2, z2.
If X is 0, following x, y, z.
Output
For each query output A[x, y, z] in one line. (1<=n<=100 sum of m <=10000)
Sample Input
2 5 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 2 2 2 0 1 1 1 0 2 2 2
Sample Output
1 0 1
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 110;
int Tree[MAXN][MAXN][MAXN],N,M;
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]++;
}
int Query(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()
{
while(cin >> N >> M)
{
memset(Tree,0,sizeof(Tree));
int op,x1,y1,z1,x2,y2,z2;
while(M--)
{
cin >> op;
if(op == 0)
{
cin >> x1 >> y1 >> z1;
cout << Query(x1,y1,z1) % 2 << endl;
}
else
{
cin >> x1 >> y1 >> z1 >> x2 >> y2 >> z2;
Update(x1,y1,z1);
Update(x1,y1,z2+1);
Update(x1,y2+1,z1);
Update(x1,y2+1,z2+1);
Update(x2+1,y1,z1);
Update(x2+1,y1,z2+1);
Update(x2+1,y2+1,z1);
Update(x2+1,y2+1,z2+1);
}
}
}
return 0;
}