hdu 3584 Cube (三维树状数组,更新区间,查询单点)

三维树状数组

容斥那里注意一下。

多组数据因为忘记清空c数组而wa了1次,细心!

  1/*************************************************************************
  2	> File Name: code/hdu/3584.cpp
  3	> Author: 111qqz
  4	> Email: rkz2013@126.com 
  5	> Created Time: 2015年08月07日 星期五 14时01分53秒
  6 ************************************************************************/
  7
  8#include<iostream>
  9#include<iomanip>
 10#include<cstdio>
 11#include<algorithm>
 12#include<cmath>
 13#include<cstring>
 14#include<string>
 15#include<map>
 16#include<set>
 17#include<queue>
 18#include<vector>
 19#include<stack>
 20#define y0 abc111qqz
 21#define y1 hust111qqz
 22#define yn hez111qqz
 23#define j1 cute111qqz
 24#define tm crazy111qqz
 25#define lr dying111qqz
 26using namespace std;
 27#define REP(i, n) for (int i=0;i<int(n);++i)  
 28typedef long long LL;
 29typedef unsigned long long ULL;
 30const int inf = 0x7fffffff;
 31const int N=1E2+5;
 32int c[N][N][N];
 33int n,m;
 34int x1,y1,z1,x2,y2,z2;
 35int lowbit( int x)
 36{
 37    return x&(-x);
 38}
 39void update ( int x,int y,int z,int delta)
 40{
 41    for ( int i = x; i <= n ; i = i + lowbit(i))
 42    {
 43	for ( int j =  y ; j <= n ; j = j + lowbit(j))
 44	{
 45	    for ( int  k = z ; k  <= n ; k = k + lowbit(k))
 46	    {
 47		c[i][j][k] += delta;
 48	    }
 49	}
 50    }
 51}
 52
 53int sum (int x,int y,int z)
 54{
 55    int res = 0;
 56    for ( int i = x; i >= 1 ; i -= lowbit(i))
 57    {
 58	for ( int j = y ; j >= 1 ; j -= lowbit(j))
 59	{
 60	    for ( int k = z ; k >= 1 ; k -= lowbit(k))
 61	    {
 62		res = res + c[i][j][k];
 63	    }
 64	}
 65    }
 66    return res;
 67}
 68int main()
 69{
 70    int op;
 71    while (scanf("%d %d",&n,&m)!=EOF)
 72    {
 73	memset(c,0,sizeof(c));
 74	for ( int i = 1 ; i <= m ; i ++ )
 75	{
 76	    scanf("%d",&op);
 77	    if (op)
 78	    {
 79		scanf("%d %d %d %d %d %d",&x1,&y1,&z1,&x2,&y2,&z2);
 80		update (x1,y1,z1,1);
 81		update (x1,y1,z2+1,1);
 82		update (x1,y2+1,z1,1);
 83		update (x2+1,y1,z1,1);
 84
 85		update (x2+1,y2+1,z1,1);
 86		update (x2+1,y1,z2+1,1);
 87		update (x1,y2+1,z2+1,1);
 88		update (x2+1,y2+1,z2+1,1);
 89
 90	    }
 91	    else
 92	    {
 93		scanf("%d %d %d",&x1,&y1,&z1);
 94		cout<<sum(x1,y1,z1)%2<<endl;
 95	    }
 96	}
 97    }
 98
 99	return 0;
100}