只A了#9,代码可能不太精简,跪求大佬提示/改错
#include <bits/stdc++.h>
using namespace std;
const int N=1e5*4+5;
int lie[N],hang[N];
void push_up1 (int p)
{
hang[p]=hang[p<<1]+hang[p<<1|1];
}
void update1 (int nl,int l,int r,int p)
{
if(l==r)
{
hang[p]^=1;
return ;
}
int mid=(l+r)>>1;
if(nl<=mid)
update1(nl,l,mid,p<<1);
else
update1(nl,mid+1,r,p<<1|1);
push_up1(p);
}
void push_up2 (int p)
{
lie[p]=lie[p<<1]+lie[p<<1|1];
}
void update2 (int nl,int l,int r,int p)
{
if(l==r)
{
lie[p]^=1;
return ;
}
int mid=(l+r)>>1;
if(nl<=mid)
update2(nl,l,mid,p<<1);
else
update2(nl,mid+1,r,p<<1|1);
push_up2(p);
}
long long query1 (int nl,int nr,int l,int r,int p)
{
long long res=0;
if(nl<=l&&r<=nr) return hang[p];
int mid=(l+r)>>1;
if(nl<=mid) res+=query1(nl,nr,l,mid,p<<1);
if(nr>mid) res+=query1(nl,nr,mid+1,r,p<<1|1);
return res;
}
long long query2 (int nl,int nr,int l,int r,int p)
{
long long res=0;
if(nl<=l&&r<=nr) return lie[p];
int mid=(l+r)>>1;
if(nl<=mid) res+=query2(nl,nr,l,mid,p<<1);
if(nr>mid) res+=query2(nl,nr,mid+1,r,p<<1|1);
return res;
}
int main()
{
/*freopen("P3801_1.in","r",stdin);
freopen("ans.out","w",stdout);*/
int n,m,q;
scanf("%d%d%d",&n,&m,&q);
while(q--)
{
int t;
cin>>t;
if(t==1)
{
int x,y;
scanf("%d%d",&x,&y);
update1(x,1,n,1);
update2(y,1,m,1);
}
else
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
long long s1=query1(x1,x2,1,n,1);
long long s2=query2(y1,y2,1,n,1);
//cout<<s1<<" "<<s2<<endl;
printf("%lld\n",s1*(y2-y1+1)+s2*(x2-x1+1)-s1*s2*2);
}
}
return 0;
}