C95 二维树状数组+差分 CF341D Iahub and Xors

视频链接:C95 二维树状数组+差分 CF341D Iahub and Xors_哔哩哔哩_bilibili

 

 

 

CF341D Iahub and Xors

Luogu CF341D Iahub and Xors

// 二维树状数组+差分 O(mlognlogn)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

#define LL long long
#define lowb(x) x&-x
int n,m;
int op,a,b,c,d; LL v,ans;
LL s[1001][1001][2][2]; //4个二维树状数组

void change(int x,int y,LL v){ //向后修
  for(int i=x;i<=n;i+=lowb(i))
    for(int j=y;j<=n;j+=lowb(j))
      s[i][j][x&1][y&1]^=v;
}
LL query(int x,int y){ //向前查
  LL t=0;
  for(int i=x;i;i-=lowb(i))
    for(int j=y;j;j-=lowb(j))
      t^=s[i][j][x&1][y&1];
  return t;
}
int main(){
  scanf("%d%d",&n,&m);
  while(m--){
    scanf("%d%d%d%d%d",&op,&a,&b,&c,&d);
    if(op==2){ //修改: 差分
      scanf("%lld",&v);
      change(a,b,v);
      change(a,d+1,v);
      change(c+1,b,v);
      change(c+1,d+1,v);
    }
    else{     //查询: 区间异或和
      ans=query(c,d)^query(c,b-1)
         ^query(a-1,d)^query(a-1,b-1);
      printf("%lld\n",ans); 
    }
  }
}

 

posted @ 2024-01-16 21:26  董晓  阅读(111)  评论(0编辑  收藏  举报