lahubとのXOR
効果の対象に
あなたは、クエリとサブマトリックスのXORの数にサブ行列XORを達成したい行列を与えます。
解決
過去に一目:すごいお母さんは、この私が二次元ツリーラインになります!
そして、TLE + MLE
フェンウィックツリー、差動思考を考えてみましょう
私たちは、セット\(D [i]の[jは [I] [J-1] \ bigoplus A [I-1] bigoplus \ [I-1]〜[J] bigoplus] [i]の[j]を=を\ [ 1-J] \) (元の行列A)(特に)格子0として
その後、我々は照会\((1,1、X、Y )\) のみ照会と同じグリッドパリティ自身にする必要があります\(dは\)だけで罰金
したがって、4つのフェンウィックツリーの確立、および、サブ行列問い合わせ差がうまく
その後、修正を係合する方法を考えます
我々は我々の改訂を見てみると、\(dは\)それだけで罰金見て引っ張る、チャートは少し小さいかもしれない:(何が起こりました)
だから、私たちのサブ行列の変更は、それを修正する4つのポイントに変換することができます。
この質問は本当に素晴らしい、スーパー思考タイトル
コード:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int read(){
int num=0;
bool f=0;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=1;
ch=getchar();
}
while(isdigit(ch)){
num=num*10+ch-'0';
ch=getchar();
}
return f?-num:num;
}
int write(int x){
if(x<0){putchar('-');x=~(x-1);}
int s[20],top=0;
while(x){s[++top]=x%10;x/=10;}
if(!top)s[++top]=0;
while(top)putchar(s[top--]+'0');
putchar('\n');
}
int c[4][1010][1010];
int n,m;
inline int lowbit(int x){return x&-x;}
void update(int type,int x,int y,int v){
while(x<=n){
int i=y;
while(i<=n){
c[type][x][i]^=v;
i+=lowbit(i);
}
x+=lowbit(x);
}
}
int query(int type,int x,int y){
int ans=0;
while(x){
int i=y;
while(i){
ans^=c[type][x][i];
i-=lowbit(i);
}
x-=lowbit(x);
}
return ans;
}
int turn(int x,int y){
return (x&1)+((y&1)<<1);
}
void update(int x0,int y0,int x1,int y1,int v){
int t1=turn(x1+1,y1+1),t2=turn(x1+1,y0),t3=turn(x0,y1+1),t4=turn(x0,y0);
//cout<<t1<<" "<<t2<<" "<<t3<<" "<<t4<<endl;
update(t1,x1+1,y1+1,v);
update(t2,x1+1,y0,v);
update(t3,x0,y1+1,v);
update(t4,x0,y0,v);
}
int query(int x0,int y0,int x1,int y1){
int t1=turn(x1,y1),t2=turn(x1,y0-1),t3=turn(x0-1,y1),t4=turn(x0-1,y0-1);
int ans=0;
ans^=query(t1,x1,y1);
ans^=query(t2,x1,y0-1);
ans^=query(t3,x0-1,y1);
ans^=query(t4,x0-1,y0-1);
return ans;
}
signed main(){
n=read(),m=read();
for(int i=1;i<=m;++i){
int opt=read(),x0=read(),y0=read(),x1=read(),y1=read();
if(opt==1){
write(query(x0,y0,x1,y1));
}
else {
int v=read();
update(x0,y0,x1,y1,v);
}
}
}