推薦閱讀 https://blog.csdn.net/qq_41252892/article/details/79035942ios
很是清楚spa
線段樹單點修改.net
emmm沒什麼了code
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<vector> #define N 320202 using namespace std; int tr_h[N],tr_l[N]; int n,m,q; void push(int *tr,int k) { tr[k]=tr[k<<1]+tr[k<<1|1]; } void change(int *tr,int k,int l,int r,int X) { int mid=(l+r)>>1; if(l==r) { tr[k]^=1; return; } if(X<=mid) change(tr,k<<1,l,mid,X); else change(tr,k<<1|1,mid+1,r,X); push(tr,k); } int ask(int *tr,int k,int l,int r,int ql,int qr) { int mid=(l+r)>>1; if(ql<=l&&qr>=r) return tr[k]; int ans=0; if(ql<=mid) ans+=ask(tr,k<<1,l,mid,ql,qr); if(qr>mid) ans+=ask(tr,k<<1|1,mid+1,r,ql,qr); push(tr,k); return ans; } int main() { scanf("%d%d%d",&n,&m,&q); for(int opt,x_1,x_2,y_1,y_2,i=1; i<=q; i++) { scanf("%d",&opt); if(opt==1) { scanf("%d%d",&x_1,&x_2); change(tr_h,1,1,n,x_1); change(tr_l,1,1,n,x_2); }else{ scanf("%d%d%d%d",&x_1,&y_1,&x_2,&y_2); int xx=ask(tr_h,1,1,n,x_1,x_2),yy=ask(tr_l,1,1,n,y_1,y_2); printf("%lld\n",1ll*xx*(y_2-y_1+1)+1ll*yy*(x_2-x_1+1)-1ll*2*xx*yy); } } return 0; }