P3801 红色的幻想乡
推荐阅读 https://blog.csdn.net/qq_41252892/article/details/79035942
非常清楚
线段树单点修改
emmm没什么了
#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;
}
博主蒟蒻,若有出错的地方,敬请指出。
如有侵犯您版权的地方,请快速联系我,我会撤回本博文。