代码大概是想拿线段树维护下区间异或修改和区间求和
#include<bits/stdc++.h>
#define ls (p<<1)
#define rs ((p<<1)+1)
#define mid ((l+r)>>1)
#define int long long
using namespace std;
const int N=100005;
int n,m,q,op,x,y,xl,yl,xr,yr,ans,sx,sy;
struct sqt
{
int s[N*4];
bool t[N*4];
void pushup(int p)
{
s[p]=s[ls]+s[rs];
}
void addtag(int p,int l,int r)
{
s[p]=(r-l+1)-s[p];
t[p]^=1;
}
void pushdown(int p,int l,int r)
{
if(t[p])
{
addtag(ls,l,mid);
addtag(rs,mid+1,r);
t[p]=0;
}
}
void add(int p,int l,int r,int now)
{
if(now<l||r<now) return;
if(l==now&&now==r) return addtag(p,l,r);
pushdown(p,l,r);
add(ls,l,mid,now);
add(rs,mid+1,r,now);
pushup(p);
}
int ask(int p,int l,int r,int L,int R)
{
if(r<L||R<l) return 0;
if(L<=l&&r<=R) return s[p];
pushdown(p,l,r);
return ask(ls,l,mid,L,R)+ask(rs,mid+1,r,L,R);
}
}a,b;
signed main()
{
ios::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
cin>>n>>m>>q;
while(q--)
{
cin>>op;
if(op==1)
{
cin>>x>>y;
a.add(1,1,n,x);
b.add(1,1,m,y);
}
if(op==2)
{
cin>>xl>>yl>>xr>>yr;
sx=a.ask(1,1,n,xl,xr);
sy=b.ask(1,1,m,yl,yr);
ans=sx*m+sy*n-2*sx*sy;
cout<<ans<<'\n';
}
}
return 0;
}